## You are here

# One time calculation in UEL

Dear All,

I'm a new UEL user. In my UEL I have a big Matrix which eigenvalues and eigenvectors of these matric is needed. the matrix is not changing during the time and it has constant elements. As you may know, calculating eigenvalues and eigenvectors is a time consuming procedure. In every time incerement, ABAQUS calculating eigenvalues and eigenvectors with bunch of other things in UEL.

What I'm looking for is this: Is there any way that I can calculate these eigenvalues and eigenvectors just one time (first time that ABAQUS calling UEL) and save it and call it from there?

Thanks in advance for your help.

Best Regards,

- ashkan khalili's blog
- Log in or register to post comments
- 8885 reads

## Comments

## One time calculation in UEL

hi ashkan,

check out the user subroutine uexternaldb. this subroutine can be used to perfom the computations (sprinc?) at the end of the increment. further you can use common type variable to store the values and recall them during the next increment.

brunda

## Hi Brunda,

Hi Brunda,

Thanks for your response and I'm sorry for my late reply on your comment.

I checked uexternaldb. I couldn't realize that if there is any way to make this subroutine to do some calculations just in the beginning of analysis or not. If there is how can I do that?

You mentioned COMMON TYPE variables. I didn't get what do you mean. would you please let me know more about it?

Let's say I have UEL and UEXTERNALDB subroutines. UEXTENALDB is performing some computations at the beginning of analysis and the results (which is a matrix) is needed in all of the time increments (UEL need them). How can I call the UEXTERNALDB's output inside of the UEL in every time increment?

It would be very kind of you to help with this issue.

Best Regards,

## hi akshan

akshan,

i would do the following.

1) at the begining of increment 1 or at time t=0, you compute the eigen values in your uel. use an if loop to achieve this.

2) at the end of increment 1, use uexternaldb to compute the eigen values and store the values in a variable.

3) from increment 2, use the stored eigen values from step 2.

4) the datatype of the variable would be common. this kind of variable can be accessed across multiple subroutines and further the stored data is not deleted during increments.

5) further in uexternaldb, you can use an if loop to control when to calculate the eigen values.

ex: if (kinc .eq. 1) then

calculate eigen values

end if

using the above loop, the eigen values are calculated only once at the end of increment 1

i hope this helps

brunda

## Hi Brunda,

Hi Brunda,

Thanks again for your valuable response.

It helped me so much.

If you don't mind I would be in touch with you in the future in case of having any problem.

Best Regards,

Hi Brunda,

I really appreciate your helpful and valuable comments.

When I'm running the analysis in ABAQUS I'm getting displacements as output (history output). Let's say at the end of analysis, for displacement in x direction I have an n*1 array (displacements in every n time increment). At the other hand I have an n*n transfer matrix which must be multiplied by n*1 displacement array. Because it's a matrix multiplication, it can't be done in every time increment and it must be done at the end of analysis. I need to define a new output (I have no idea how I can do that), lets name it Transformed-Displacement, and have it on history output. It should have the same ability, at the results part, as other outputs have.

It would be very kind of you to help me with this.

Best Regards,

Normal

0

false

false

false

EN-US

X-NONE

AR-SA

/* Style Definitions */

table.MsoNormalTable

{mso-style-name:"Table Normal";

mso-tstyle-rowband-size:0;

mso-tstyle-colband-size:0;

mso-style-noshow:yes;

mso-style-priority:99;

mso-style-parent:"";

mso-padding-alt:0in 5.4pt 0in 5.4pt;

mso-para-margin-top:0in;

mso-para-margin-right:0in;

mso-para-margin-bottom:10.0pt;

mso-para-margin-left:0in;

line-height:115%;

mso-pagination:widow-orphan;

font-size:11.0pt;

font-family:"Calibri","sans-serif";

mso-ascii-font-family:Calibri;

mso-ascii-theme-font:minor-latin;

mso-hansi-font-family:Calibri;

mso-hansi-theme-font:minor-latin;}

## Hi Brunda,

Hi Brunda,

I really appreciate your helpful and valuable comments.

When I'm running the analysis in ABAQUS I'm getting displacements as output (history output). Let's say at the end of analysis, for displacement in x direction I have an n*1 array (displacements in every n time increment). At the other hand I have an n*n transfer matrix which must be multiplied by n*1 displacement array. Because it's a matrix multiplication, it can't be done in every time increment and it must be done at the end of analysis. I need to define a new output (I have no idea how I can do that), lets name it Transformed-Displacement, and have it on history output. It should have the same ability, at the results part, as other outputs have.

It would be very kind of you to help me with this.

Best Regards,

## Hi Ashkan

Hello Ashkan,

I do not follow your question completely.

Will you be able to access the displacements and transfer matrix in the subroutine? If yes, then you can create some loops and multiply them.

Also, what do you mean by " It should have the same ability, at the results part, as other outputs have.".

B

## Hi Brunda,

Hi Brunda,

Thanks for your response.

I'm using UEL. Displacements that I'm calculating by UEL are in frequency domain, U(f). I want to change them to time domain, U(t). For doing that I must multiply a trnsfer matrix (n*n) by U (n*1). I'm calculating transfer matrix inside of the UEL and I have access to displacement (U). In history output part of ABAQUS, what I have as displacement is U(f), displacement in frequency domain. Is there anyway that I can add a user-defined history output, let's name it UT, and ask ABAQUS to calculate it for me?

Let's say there is no way to do that. Now I have to write the U(f) and transfer matrix to two files and then in another fortran code call them and multiply them and plot them. Writing transfer matrix to a file is not a big deal but, writing displacement, U, is difficult because it's been calculating in every time incerement. When I'm trying to write it to a file, because for ever time incerement it has a new value, it is been over writing on the value of last incerement. But I need the value of every time incerement to be written in the file. How can I do that?

I really appreciate your consideration. Thanks in advance.

Best Regards,

## Hi ashkan,

Hi ashkan,

a) you have both matrices, multiply them .. write the code for in your uel file.

b) you can store the values on SVARS. assuming you have three displacements after step 1, then you will need three SVARS.

as far as I remember you can use SVARS to store the solution dependent variables.

hope this helps

brunda

## Hi Brunda,

Hi Brunda,

Thanks for your great comments. They are really helpful.

Best Regards,

## Hi Brunda,As you know I'm

Hi Brunda,

As you know I'm using UEL. I have two beam elements in a row (elements is defined in UEL) and every element has two nodes. So, this structure will have three nodes. The node #1 is fixed completely (ENCASTRE) and node #3 is the tip of this structure. There is a load on node#3 (let's say a static one) with a user defined amplitude (defined in UAMP subroutine). In HISTORY OUTPUT part of the input file, I'm asking ABAQUS to give me the displacement for the node #2 (the node in the middle of the structure). I will refer to it as DIS2 after this (n*1 dimension). During UEL calculations I'm getting a big matrix (let's call it AA), n*n dimension. I must multiply AA by DIS2 (AA*DIS2). The point is this, I don't know how I can have access to history output results for the node #2.

One of the methods which came to my mind is defining another step. But I'm not sure is that going to work? How can I write results for a step and call them during another step? How can I have access to AA matrix in the later step?

I would appreciate if you can help through this out as usual.

Best Regards,

P.S.: I've tried to make the simplest example by using two elements in a row. What I have is a lot more than two.