Eng-Tips is the largest engineering community on the Internet

Intelligent Work Forums for Engineering Professionals

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

VUSDFLD for latham's macroscopic damage 1

Status
Not open for further replies.

abhi2235

Mechanical
Oct 4, 2011
9
0
0
Hello All,

Greetings

I have used USDFLD subroutine in order to implement latham's macroscopic damage in abaqus standard which is successful. I applied trapezoidal rule for numerical integration.

The same thing i want to apply in abaqus explicit using VUSDFLD with same procedure but it is not working.

The aim is to integrate principal stress with respect to equvalent plastic strain at each material point at each steap.

Can someone please tell me where, I am doing mistake.

Thanks (attached vusdfld file)
 
Replies continue below

Recommended for you

Hi,

I took a look for your subroutine and I do not understand some things.
You are calling VGETVRM subroutine for 'SP' output and next you are doing the same for 'PE' output.
Abaqus saves your output for 'SP' into "rData" array but before you use these data you overwrite them with data for 'PE'.
You use two two-dimension array (stress and strain) but you have no declaration for them. I belive you should get compilation-time error. Where in your code do you save any data into these two data?

Regards,
Bartosz
 
Hello Sir,

Thank you for the reply. I want to compute latham-cockcroft damage parameter at each point. This parameter is defined as integration of principal stress with respect to equivalent plastic strain.

For this I want to apply trapezoidal integration rule as I did earlier in usdfld. Steps are as follows.


1. Call the max. principal stress and equivalent plastic strain of current step at each point.

2. Call the max. principal stress and equivalent plastic strain of previous step at each point.

3. Call the damage parameter upto previous step at each point.

4. Calculate plastic strrain increment ( equivalent plastic strain of current - previous step) at each point.

5. Average principal stress [( principal stress of current - previous step)/2] at each point.

6. Damage parameter increment at current step ( Average principal stress * plastic strain increment) at each point.

7. Damage parameter at current step = damage parameter upto previous step + damage paramater increment at current step.

8. Save Damage parameter increment of current step, equvalent plastic strain of current step, principal stress of current step and total damage parameter upto current step as solution dependent variable which will be called in next step as previous values ( 2. and 3.)

9. Set field = 0 if damage parameter lesses than the one obtain from experiments else set field = 1

These steps I earlier applied in usdfld which was successful but now as I am using explicit I want to apply for vusdfld but it does not works.

I am attaching the USDFLD file here for more clear idea about procedure.
 
 http://files.engineering.com/getfile.aspx?folder=2b5d04c0-08f9-48f4-8702-cd95e4815cb4&file=usdfld.f
Hello,

Thanks for USDFLD subroutine.

In USDFLD subroutine you call GETVRM routine to get outputs which you need and after each call You save them in variables (PRINC, PRI, PEEQ, ...).
I do not understand why you do not do the same in VUSDFLD. In the suborutne for Abaqus/Explicit you call VGETVRM routine twice but you do not save outputs for variable from "rData" array.
Instead of this you have following code:
Code:
princ=stress(k,3)
peeq=strain(k,7)
You try to get stress and strain values from arrays "stress" and "strain". Where do you have declaration for these arrays?
You do not save any data to these arrays Abaqus also does not do this.

By the way You do not have to ready outputs from state-dependent arrays.
Instead
Code:
  CALL GETVRM('SDV',ARRAY,JARRAY,FLGRAY,JRCD,JMAC,JMATYP,
1 MATLAYO,LACCFLA)
  PQ=ARRAY(2)

You can get direct acces to STATEV array:
Code:
PQ=STATEV(4)

Regards,
Bartosz
 
Hello Sir,

Thanks for your tips for simplifying my USDFLD subroutine. But still have problem with the VUSDFLD one.

I again gone through abaqus example problems and made some modifications but still it don't work :(

now it says

Error: vusdfld.f, line 42: The number of subscripts is incorrect. [STRESS]
princ=stress(k,3)
------------^
fortcom: Error: vusdfld.f, line 43: The number of subscripts is incorrect. [STRAIN]
peeq=strain(k,7)


Thank you
 
 http://files.engineering.com/getfile.aspx?folder=febf5beb-87d1-4edd-8c45-396c691cd363&file=vusdfld.f
Hi,

The compilation error is because your "stress" and "strain" array is 1-rank array (vector) but your reference is for 2-rank array (matrix).
I again gone through abaqus example problems
I see you are working with VUSDFLD subroutine example from Abaqus documentation. The example is very clever but not simple.
The example use internal subroutine "setField" to read stress data.
I think it is a little bit complicated as a example and it can make a confusion for a person who wants to learn subroutines in Abaqus but has no experience with FORTRAN. To understand the example you need to know what FORTRAN is doing when you pass an array as a subroutine dummy argument and how does FORTRAN organize data in memory for 1-rank and 2-rank array.

If you want to read results data in similar way as in example but without internal subroutine please try following code:
Code:
       ! declaration section
      dimension stress(nblock,nrData)
      dimension strain(nblock)

      parameter(iS11 = 1,
     &          iS22 = 2,
     &          iS33 = 3,
     &          iS12 = 4,
     &          iS23 = 5,
     &          iS31 = 6)

!     read stress components
      call vgetvrm( 'S', rData, jData, cData, jStatus )
!     save stress data into "stress" array
      stress = reshape(rData, (/nblock, nrData/))

!     read strain value
      call vgetvrm( 'PEEQ', rData, jData, cData, jStatus )
!     save PEEQ data into "strain" array
      strain = rData(1:nblock)

Stress data are saved into 2-rank "stress" array. You can read data with statement:
Code:
myVariable = stress(i,compName)
where:
i - is material point number, it changes from 1 to nblock
compName - component name (iS11, iS22, iS33, iS12, iS23 or iS31)

Strain data are saved into 1-rank "strain" array.
Code:
myVariable = strain(i)
i - is material point number, it changes from 1 to nblock

Regards,
Bartosz
 
Hello Sir,

I tried with the codes as you suggested in last discussion. Now it is better and errors reduced but still giving some errors as indicated.

Thank you

fortcom: Error: vusd.f, line 39: An array-valued argument is required in this context. [RESHAPE]
stress = reshape(rData, (/nblock, nrData/))
-----------------------^
fortcom: Error: vusd.f, line 43: A substring must be of type CHARACTER. [RDATA]
strain = rData(1:nblock)
---------------^
fortcom: Error: vusd.f, line 26: A specification expression object must be a dummy argument, a COMMON block object, or an object accessible through host or use association [NRDATA]
dimension stress(nblock,nrData)

 
 http://files.engineering.com/getfile.aspx?folder=5b024ceb-4713-4e39-9b71-a2cd7b6edb84&file=vusd.f
Hello,

Both errors are because your declaration statement block is not complete.
In Abaqus documentation you will find a subroutine interface for all subroutines. The interface include also declaration statement block with variables used and/or passed into subroutine.

Interface for VUSDFLD subroutine is:
Code:
      subroutine vusdfld(
c Read only variables -
     1   nblock, nstatev, nfieldv, nprops, ndir, nshr, 
     2   jElem, kIntPt, kLayer, kSecPt, 
     3   stepTime, totalTime, dt, cmname, 
     4   coordMp, direct, T, charLength, props, 
     5   stateOld, 
c Write only variables -
     6   stateNew, field )
c
      include 'vaba_param.inc'
c
      dimension jElem(nblock), coordMp(nblock,*), 
     1          direct(nblock,3,3), T(nblock,3,3), 
     2          charLength(nblock), props(nprops), 
     3          stateOld(nblock,nstatev), 
     4          stateNew(nblock,nstatev),
     5          field(nblock,nfieldv)
      character*80 cmname
c
c     Local arrays from vgetvrm are dimensioned to 
c     maximum block size (maxblk)
c
      parameter( nrData=6 )
      character*3 cData(maxblk*nrData)
      dimension rData(maxblk*nrData), jData(maxblk*nrData)
c
      do 100 k = 1, nblock

         user coding to define field(nblock,nfieldv)
         and, if necessary, stateNew(nblock,nstatev)

  100 continue
c
      return
      end

Declaration block is:
Code:
      dimension jElem(nblock), coordMp(nblock,*), 
     1          direct(nblock,3,3), T(nblock,3,3), 
     2          charLength(nblock), props(nprops), 
     3          stateOld(nblock,nstatev), 
     4          stateNew(nblock,nstatev),
     5          field(nblock,nfieldv)
      character*80 cmname
c
c     Local arrays from vgetvrm are dimensioned to 
c     maximum block size (maxblk)
c
      parameter( nrData=6 )
      character*3 cData(maxblk*nrData)
      dimension rData(maxblk*nrData), jData(maxblk*nrData)
You MUST NOT make any change here but of course You can add new declaration!
When we compare your subroutine and declaration from documentation we see some informations are missing.
You have no declaration for "rData" array and "nrData" parameter.
Code:
parameter( nrData=6 )
dimension rData(maxblk*nrData), jData(maxblk*nrData)
This is a reason why Fortran is not able compile your subroutine.
In first and second error we have message that "rData" must be an array.In your subroutine it is a real variable since there is no "dimension rData(maxblk*nrData)" line.
The third error tells us there is no "nrData" declaration because you do not have "parameter( nrData=6 )" line.

Please check you declaration block with documentation.

Best Regards,
Bartosz

 
Hello Sir,

Good Day!

I made the changes and now Abaqus is compiling the .inp file and ODB results are shown, but still there is some problem in subroutine file. In the log file it says

vusd.f(42): (col. 7) remark: LOOP WAS VECTORIZED.
vusd.f(46): (col. 7) remark: LOOP WAS VECTORIZED.


Also in .ODB file display in CAE mode out of the 5 solution dependent variables only one is shown SDV1 but for that also all values in all steps are zero also filed variable not showing. However in input file, I have defined as follows

*USER DEFINED FIELD
*DEPVAR
5

and

*ELEMENT OUTPUT
FV,SDV

But now positive thing is .inp file is running properly and ODB results shown.

Thank you


Sincerely
Abhishek

 
 http://files.engineering.com/getfile.aspx?folder=30f7e8e4-64d3-48c6-9468-0173bcbfc3df&file=vusd.f
Hi,

Don't be worry about these remark message. This is just information from compilator
about some optimization changes with your source code to get better performance during subroutine execution.

Respect to outputs issue can You also post your *.inp file.

Thanks and Regards,
Bartosz
 
Hi,

Thank You for the Abaqus inputdeck, I took a look for it. Your output definition for SDV is ok.
The reason why You have zero values for SDV is that "princ" variable is always set to 0.0.
The variable is define respect to "stress" array and the array is always set to 0.0 because of wrong definition of VGETVRM routine.

You cannot use "SP" keyword with VGETVRM routine.
A list of supported keywords You can find in Abaqus documentation: 2.1.7 Obtaining material point information in an Abaqus/Explicit analysis.

Also it is good idea to test "jStatus". It should be 0 after VGETVRM calling, in your case it is 1.

Regards,
Bartosz
 
Hello Sir

I already tried just for example using

call vgetvrm( 'S', rData, jData, cData, jStatus )

and

princ = stress(i,iS22)


it had also the same SDV1 output as zero.
after i tried with SP as i want to call principal stress which also has same SDV1 output as zero.

Also I tried with changing jStatus as zero after calling vgetvrm but it also does not effect the results.

very interestingly in explicit material information in documentation 2.1.7 there is no information about calling princial stress and many things. I am not sure if VUSDFLD is the right option to use for damage criteiras. Because in various articles i saw people using VUMAT. but as it is difficult to learn i am trying with VUSDFLD as in standard version USDFLD worked nicely. but in this subroutine many options like stress triaxiality, hydrostatic pressure, mises stress are not available for vgetvrm seems.

Thanks
 
Hello again,

The reason why You still get zero values for SDV is
Code:
if(totdam.ne.0)then
The condition is never true since totdam is always zero.
It means you never set a new values for any state dependent variable.

Please also do not mix real and integer variable in one statement because the result of calculation will be integer.
Code:
mnst = (princ + pri)/2
change into
Code:
mnst = (princ + pri)/2.d0
Change all your integer constants into real values.
many options like stress triaxiality, hydrostatic pressure, mises stress are not available for vgetvrm seems
Yes it is true, but all this quantities can be calculate base on stress tensor and this output is available for VGETVRM routine.
Be aware that when you call VGETVRM routine with 'S' you get stress tensor, if you need principal stress you need to compute them by yourself.

Regards,
Bartosz
 
Status
Not open for further replies.
Back
Top