Continue to Site

Eng-Tips is the largest engineering community on the Internet

Intelligent Work Forums for Engineering Professionals

  • Congratulations IDS on being selected by the Eng-Tips community for having the most helpful posts in the forums last week. Way to Go!

How to save the original coordinates COORDS in the DISP subroutine? 1

Status
Not open for further replies.

eispiata

Materials
Feb 18, 2008
48
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

 
Replies continue below

Recommended for you

DISP is called to prescribe the displacements. I.e. the displacements at the nodes for which DISP is called are known by the user.

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.





 
Hi,

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
 
number of nodes = total number of nodes in the model
no. of dimensions = actually should be the number of coordinates (per node) you want to store.
 
Ok so in my case since i would like to store only one coordinate (along the y-axis) then i should type in 1.

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
 
Yes, there's a way I think.

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.


 
Hi xerf,

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
 
Sorry, I do not have/know any helpful document or web-site.

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.
 
Hi xerf,

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
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor