How to save the original coordinates COORDS in the DISP subroutine?
How to save the original coordinates COORDS in the DISP subroutine?
(OP)
Hi everybody,
I built up a model that calls a DISP subroutine to compute the displacement at its outside boundary.
When i use only one step to get to the solution then i get the final displacement that i expected.
But when i use two or more steps then the solution is always higher than i expected because the COORDS vector is updated at each step so that the new coordinates in the previous step become the original coordinates in the next step. I would like to be able to save the first original coordinates in the DISP subroutine.
I am not good at Fortran but i have been told that i could save the original coordinates of the point using a
COMMON block along with the command SAVE so it should be something like:
COMMON /block/ name of the variables
SAVE /block/
But how can i use this feature in a DISP subroutine?
Thanks,
Malik
SUBROUTINE DISP(U,KSTEP,KINC,TIME,NODE,NOEL,JDOF,COORDS)
C
INCLUDE 'ABA_PARAM.INC'
C
DIMENSION U(3),TIME(2),COORDS(3)
C
U(1)=10*COORDS(2)
RETURN
END
I built up a model that calls a DISP subroutine to compute the displacement at its outside boundary.
When i use only one step to get to the solution then i get the final displacement that i expected.
But when i use two or more steps then the solution is always higher than i expected because the COORDS vector is updated at each step so that the new coordinates in the previous step become the original coordinates in the next step. I would like to be able to save the first original coordinates in the DISP subroutine.
I am not good at Fortran but i have been told that i could save the original coordinates of the point using a
COMMON block along with the command SAVE so it should be something like:
COMMON /block/ name of the variables
SAVE /block/
But how can i use this feature in a DISP subroutine?
Thanks,
Malik
SUBROUTINE DISP(U,KSTEP,KINC,TIME,NODE,NOEL,JDOF,COORDS)
C
INCLUDE 'ABA_PARAM.INC'
C
DIMENSION U(3),TIME(2),COORDS(3)
C
U(1)=10*COORDS(2)
RETURN
END





RE: How to save the original coordinates COORDS in the DISP subroutine?
Therefore, the original coordinates could be computed by subtracting the known (applied) displacement field from the current coordinates.
Also if NLGEOM=OFF then, DISP is called with COORDS containing the original coordinates.
Alternatively you can define an array in a COMMON block:
Real(8), dimension(no_of_nodes, no_of_dimensions)::COORDS0
common /myblock/ COORDS0
end
SUBROUTINE DISP(U,KSTEP,KINC,TIME,NODE,NOEL,JDOF,COORDS)
C
INCLUDE 'ABA_PARAM.INC'
C
DIMENSION U(3),TIME(2),COORDS(3)
C
Real(8), dimension(number of nodes, no. of dimensions)::COORDS0
common /myblock/ COORDS0
if((KSTEP==1).and.(KINC==1)) then
! during the first increment of first step
! store the orginal coordinates
COORDS0(NODE,1)=COORDS(1)
COORDS0(NODE,2)=COORDS(2)
COORDS0(NODE,3)=COORDS(3) ! if necessary
endif
U(1)=10*COORDS0(NODE,2)
RETURN
END
However, the code above is a bit redundant if DISP is called for more than 1 DOF (displacement) for each node.
Also, you waste some memory since you define an array as for storing the coordinates of all nodes whereas only the coordinates of the nodes for which DISP is called are stored. But is a quick solution.
RE: How to save the original coordinates COORDS in the DISP subroutine?
First of all thank you for your precious help.
I successfully ran the subroutine but i have a few questions to ask you.
Indeed i would like to make sure that i understood well the meaning of the following statement:
Real(8), dimension(number of nodes,no. of dimensions)
So in this statement i should replace:
1) "number of nodes" by the number of nodes to which the Disp subroutine is applied?
2) "no. of dimensions" by the degree of freedom of the general model? As an example, i mean for a plane stress membrane with 3 degrees of freedom (ux, uy + 1 rotation) i should type in 3...
Let me know if i am right or wrong.
Best regards,
Malik
RE: How to save the original coordinates COORDS in the DISP subroutine?
no. of dimensions = actually should be the number of coordinates (per node) you want to store.
RE: How to save the original coordinates COORDS in the DISP subroutine?
You mean that i have to type in the total number of nodes in the model. Is there a way to boil it down to the number of nodes to which the DISP constraint is applied?
Cause what i did yesterday is that i tipped in the actual number of nodes to which the subroutine was applied and it worked... I don't know if i was lucky ...
Thanks,
Malik
RE: How to save the original coordinates COORDS in the DISP subroutine?
Add an extra column to COORDS0 to store the node labels.
For example, column 1 store the node labels, column 2 store the original y coord.
When disp is called, you have to iterate over COORDS0 to identify the node label and to recover the initial y-coordinate for that node.
RE: How to save the original coordinates COORDS in the DISP subroutine?
I see what you mean. It is a good idea.
You seem to be quite familiar with these things and i would like to read up on them. Could you let me know if you have any document or website which deals with these things.
Thanks again for your precious help,
Malik
RE: How to save the original coordinates COORDS in the DISP subroutine?
I try/test/study everything by myself.
When it comes to programming, it's always difficult in the beginning when you start using a new language. The most important is not to give up.
The HTML ABAQUS documentation is pretty good if you have patience and use the search capabilities.
Best.
RE: How to save the original coordinates COORDS in the DISP subroutine?
You were very helpful and even if i am not very familiar with Fortran i can assure you i am not going to give up.
Most important to me is to move on.
Best regards,
Malik