The Abaqus user subroutines provide a useful means for the calculation of additional parameters. E.g.
USDFLD: "allows you to define field variables at a material point as functions of time or of any of the available material point quantities listed in the Output Variable Identifiers table".
A routine called GETVRM can be called from within USDFLD. The manual says: "Utility routine GETVRM can be called from either user subroutine ... USDFLD to access material integration point information".
There is an example in the Abaqus manual under USDFLD that shows how solution variables can be accessed and then how user defined state variables (STATEV) can be updated during an analysis.
It might be helpful to look at the thesis by Nicholas O'Meara ('Developing material models for use in finite element predictions of residual stresses in ferritic steel welds', University of Manchester) for more detailed information. Some information is given in section 4.4 ('Implementation of the Models').
Thank you for the suggestion. I will look in to thesis.
I tried using the USDFLD subroutine to calculate the cooling rate. Based upon the cooling rate I defined the fraction of martensite formed using the CCC diagram. But the what I am not able to figure out is
1.How can I get the time increment between exactly 800-500 to get the cooling rate?.
I tried to store FIELD(2)=TIME(1) when the temperature reaches 800 and
FIELD(3)=TIME(1) when temp reaches 500 degree. It is then used to calculate the time increment
I defined the cooling rate as
Statev()=(800-500)/(FV(3)-FV(2)) to get the cooling rate between 800-500.
2.Do I need to define the cooling rate equation for thick/thin plate in the USDFLD?
3.I tried to define rate of cooling/heating as
FV()=DTEMP/DTIME
where DTEMP is calculated by using USDFLD subroutine and GETVRM.
But I believe this gives only Cooling rate / increment not between 800-500
Because of not incorporating the cooling rate at different material point the volume change due to stain increment is not calculating correctly. The impact of phase transformation can be observed( i.e. the formation of compressive stress where the martensite is considered),but the stress values inside the HAZ showing huge difference.
It looks like you have made a lot of good progress already. I comment on your points below.
1. Are you saying that the method of calculating the 800-500 that you describe does not work?
2. I am not sure I understand what you are saying about thick and thin plates. I presume Abaqus will predict different cooling rates for thick and thin plates.
3. The cooling rate calculated in an increment would not be the same as the 800-500 value.
Nicholas O'Meara (Nick) measured phases during different thermal cycles to determine the phase fractions using a Gleeble. He fitted the data to a formulae published by Li et al (Metall. Mater. Trans. B, vol. 29, no. June, pp. 661–672, 1998) for the diffusive transformations and then used Koistinen-Marburger for the Martensite (Acta Mater., no. 7, pp. 59–60, 1959).
I started looking into the thesis suggested by you
I think I am totally missing the logic to calculate the cooling rate using USDFLD and not able to do so. The other things like getting max temp, calculating differences in temperature to find whether heating/cooling taking place at material points are working well with USDFLD and GETVRM.
I may be missing the concept may be the reason for question 2 I have raised regarding thick/thin plates.
I was recreating the article by Deng et al.(FEM prediction of welding residual stress considering phase transformation effects). The results are good when no phase change is considered. In the article, the martensite fraction curve is given for the temperature change between 800-500 degrees Celcius. I understood that this variation has to be passed to the UEXPAN subroutine which defines the EXPAN(1), considering the volume change due to martensite formation by the Kostien Marburger equation.
But I am not getting the idea to incorporate the fraction of martensite with cooling rate using USDFLD so that I can pass fraction to EXPAN(1) based on the cooling rate.
I assume that it should be possible to use the user subroutines to store the time when a point reaches 800 and then the time when the same point reaches 500. These two times could then be used to determine the 800-500 cooling time and therefore Ms. The UEXPAN could read the value of Ms and then calculate the expansion behaviour through the transformation.
Since we cannot exactly say that the temperature reaches 800 ie it may be 800.8,801,806, etc, this causes the state variables not to store the values. If we give TEMP .GE.800, it will store all the time(1) greater than 800.
Also, I am not finding any Loops that can be used in the Fortran to terminate the program when it reaches a value of less than 500.