32 type (hecmwST_local_mesh) :: hecMESH
33 type (hecmwST_matrix ) :: hecMAT
34 type (fstr_param ) :: fstrPARAM
35 type (fstr_solid ) :: fstrSOLID
36 type (hecmwST_matrix_lagrange) :: hecLagMAT
37 type (fstr_info_contactChange) :: infoCTChange, infoCTChange_bak
38 type (hecmwST_matrix ) :: conMAT
40 integer(kind=kint) :: ndof, nn
41 integer(kind=kint) :: j, i, tot_step, step_count, tot_step_print, CBbound
42 integer(kind=kint) :: sub_step
43 integer(kind=kint) :: restart_step_num, restart_substep_num
44 real(kind=kreal) :: ctime, dtime, endtime, factor
45 real(kind=kreal) :: time_1, time_2
46 logical :: ctchanged, is_OutPoint, is_interaction_active
50 hecmat%NDOF = hecmesh%n_dof
55 is_interaction_active = (
associated( fstrsolid%contacts ) .or.
associated( fstrsolid%embeds ) )
57 if( fstrsolid%TEMP_ngrp_tot>0 .and. hecmesh%hecmw_flag_initcon==1 )
then
58 fstrsolid%last_temp = 0.0d0
59 fstrsolid%temperature = 0.0d0
60 do j=1,
size(hecmesh%node_init_val_item)
61 i = hecmesh%node_init_val_index(j)
62 fstrsolid%last_temp(j) = hecmesh%node_init_val_item(i)
63 fstrsolid%temperature(j) = hecmesh%node_init_val_item(i)
66 if( fstrsolid%TEMP_ngrp_tot>0 .and.
associated(
g_initialcnd) )
then
67 fstrsolid%last_temp = 0.0d0
68 fstrsolid%temperature = 0.0d0
71 if( .not.
associated(fstrsolid%temperature) )
then
72 allocate( fstrsolid%temperature( hecmesh%n_node ) )
73 allocate( fstrsolid%temp_bak( hecmesh%n_node ) )
74 allocate( fstrsolid%last_temp( hecmesh%n_node ) )
76 do i= 1, hecmesh%n_node
78 fstrsolid%temperature(i) = fstrsolid%last_temp(i)
84 if(
associated( fstrsolid%contacts ) )
then
85 call initialize_contact_output_vectors(fstrsolid,hecmat)
86 call setup_contact_elesurf_for_area( 1, hecmesh, fstrsolid )
88 if( fstrsolid%n_embeds > 0 )
call initialize_embed_vectors(fstrsolid,hecmat)
91 restart_substep_num = 1
92 fstrsolid%unode = 0.0d0
94 infoctchange%contactNode_previous = 0
95 infoctchange%contactNode_current = 0
96 if( fstrsolid%restart_nout < 0 )
then
97 call fstr_read_restart(restart_step_num,restart_substep_num,step_count,ctime,dtime,hecmesh,fstrsolid, &
98 fstrparam,infoctchange%contactNode_previous)
102 fstrsolid%restart_nout = - fstrsolid%restart_nout
107 fstrsolid%FACTOR = 0.0d0
112 do tot_step=1, fstrsolid%nstep_tot
113 tot_step_print = tot_step+restart_step_num-1
114 if(hecmesh%my_rank==0)
write(*,*)
''
115 if(hecmesh%my_rank==0)
write(*,
'(a,i5)')
' loading step=',tot_step_print
117 if( fstrsolid%TEMP_ngrp_tot>0 )
then
118 do j=1, hecmesh%n_node
119 fstrsolid%temp_bak(j) = fstrsolid%temperature(j)
122 call fstr_updatestate( hecmesh, fstrsolid, 0.0d0 )
125 fstrsolid%unode_bak(:) = fstrsolid%unode(:)
130 sub_step = restart_substep_num
135 & fstrsolid%NRstat_i, fstrsolid%NRstat_r, fstrsolid%AutoINC_stat, fstrsolid%CutBack_stat )
136 if( fstrsolid%TEMP_irres > 0 )
then
137 fstrsolid%FACTOR(1) = 0.d0
138 fstrsolid%FACTOR(2) = 1.d0
140 fstrsolid%TEMP_FACTOR = factor
143 fstrsolid%FACTOR(1) = factor
145 fstrsolid%FACTOR(2) = factor
148 if(hecmesh%my_rank==0)
then
149 write(*,
'(A,I0,2(A,E12.4))')
' sub_step= ',sub_step,
', &
151 write(*,
'(A,2f12.7)')
' loading_factor= ', fstrsolid%FACTOR
152 if( fstrsolid%TEMP_irres > 0 )
write(*,
'(A,2f12.7)')
' readtemp_factor= ', fstrsolid%TEMP_FACTOR
155 time_1 = hecmw_wtime()
158 if( .not. is_interaction_active )
then
159 if( fstrparam%nlsolver_method ==
knsmnewton )
then
160 call fstr_newton( tot_step, hecmesh, hecmat, fstrsolid, fstrparam, &
178 & tot_step_print, sub_step, fstrsolid%NRstat_i, fstrsolid%NRstat_r, &
179 & fstrsolid%AutoINC_stat, fstrsolid%CutBack_stat )
182 if( fstrsolid%CutBack_stat == 0 )
then
187 cbbound = fstrparam%ainc(fstrsolid%step_ctrl(tot_step)%AincParam_id)%CBbound
188 if( fstrsolid%CutBack_stat == cbbound )
then
189 if( hecmesh%my_rank == 0 )
then
190 write(*,*)
'Number of successive cutback reached max number: ',cbbound
193 call hecmw_abort( hecmw_comm_get_comm() )
199 if( is_interaction_active .and. fstrparam%contact_algo ==
kcaslagrange )
then
205 if( hecmesh%my_rank == 0 )
write(*,*)
'### State has been restored at time =',
fstr_get_time()
208 if( sub_step == fstrsolid%step_ctrl(tot_step)%num_substep )
then
209 if( hecmesh%my_rank == 0 )
then
210 write(*,
'(a,i5,a,f6.3)')
'### Number of substeps reached max number: at total_step=', &
213 call hecmw_abort( hecmw_comm_get_comm())
217 time_2 = hecmw_wtime()
218 if( hecmesh%my_rank==0)
write(
imsg,
'(a,",",2(I8,","),f10.2)') &
219 &
'step, substep, solve (sec) :', tot_step_print, sub_step, time_2 - time_1
223 if( fstrsolid%CutBack_stat > 0 ) stop
227 step_count = step_count + 1
230 if( fstrsolid%restart_nout > 0)
then
231 if( mod(step_count,fstrsolid%restart_nout) == 0 )
then
243 time_2 = hecmw_wtime()
244 if( hecmesh%my_rank==0 )
then
245 write(
imsg,
'(A,",",2(I8,","),f10.2)')
'step, substep, solve (sec) :', tot_step_print, sub_step, time_2 - time_1
246 write(
imsg,
'(A,I0,",",1pE15.8)')
'### stepcount (for output), time :', step_count,
fstr_get_time()
252 if( sub_step == fstrsolid%step_ctrl(tot_step)%num_substep )
then
253 if( hecmesh%my_rank == 0 )
then
254 write(*,
'(a,i5,a,f6.3)')
'### Number of substeps reached max number: at total_step=', &
261 sub_step = sub_step + 1
265 if( fstrsolid%restart_nout > 0 )
then
267 & hecmesh,fstrsolid,fstrparam,.true.,infoctchange%contactNode_current)
269 restart_substep_num = 1
270 if( fstrsolid%TEMP_irres > 0 )
exit
278 write(
imsg,
'("### FSTR_SOLVE_NLGEOM FINISHED!")')
279 write(*,
'("### FSTR_SOLVE_NLGEOM FINISHED!")')
289 type ( hecmwST_local_mesh ),
intent(in) :: hecMESH
290 type ( fstr_solid ),
intent(in) :: fstrSOLID
291 integer(kind=kint),
intent(in) :: cstep
292 real(kind=kreal),
intent(in) :: time
293 real(kind=kreal),
intent(out) :: f_t
295 integer(kind=kint) :: jj_n_amp
297 jj_n_amp = fstrsolid%step_ctrl( cstep )%amp_id
299 if( jj_n_amp <= 0 )
then
300 f_t = (time-fstrsolid%step_ctrl(cstep)%starttime)/fstrsolid%step_ctrl(cstep)%elapsetime
301 if( f_t>1.d0 ) f_t=1.d0
303 call table_amp(hecmesh, fstrsolid, cstep, jj_n_amp, time, f_t)
This module provides functions to deal with cutback.
subroutine fstr_cutback_save(fstrSOLID, infoCTChange, infoCTChange_bak)
Save analysis status.
subroutine fstr_cutback_load(fstrSOLID, infoCTChange, infoCTChange_bak)
Load analysis status.
subroutine fstr_cutback_init(hecMESH, fstrSOLID, fstrPARAM)
Initializer of cutback variables.
subroutine fstr_cutback_finalize(fstrSOLID)
Finalizer of cutback variables.
logical function fstr_cutback_active()
Finite-rotation nodal kinematics for NLGEOM.
subroutine, public fstr_begin_nodal_kinematics_step(hecMESH, fstrSOLID, ndof)
Snapshot the converged rotation state at the start of a load step and reset the Newton trial state to...
This module provides functions on nonlinear analysis.
subroutine fstr_newton_contactslag(cstep, hecMESH, hecMAT, fstrSOLID, fstrPARAM, hecLagMAT, restart_step_num, restart_substep_num, sub_step, ctime, dtime, infoCTChange, conMAT)
This subroutine solve nonlinear solid mechanics problems by Newton-Raphson method....
subroutine fstr_newton_contactalag(cstep, hecMESH, hecMAT, fstrSOLID, fstrPARAM, restart_step_num, restart_substep_num, sub_step, ctime, dtime, infoCTChange, conMAT)
This subroutine solve nonlinear solid mechanics problems by Newton-Raphson method combined with Neste...
subroutine fstr_newton(cstep, hecMESH, hecMAT, fstrSOLID, fstrPARAM, restrt_step_num, sub_step, ctime, dtime)
This subroutine solve nonlinear solid mechanics problems by Newton-Raphson method.
This module provides functions on nonlinear analysis.
subroutine fstr_quasi_newton(cstep, hecMESH, hecMAT, fstrSOLID, fstrPARAM, restrt_step_num, sub_step, ctime, dtime)
This subroutine solve nonlinear solid mechanics problems by Newton-Raphson method.
This module provides functions to read in and write out restart files.
subroutine fstr_read_restart(cstep, substep, step_count, ctime, dtime, hecMESH, fstrSOLID, fstrPARAM, contactNode)
Read in restart file.
subroutine fstr_write_restart(cstep, cstep_ext, substep, step_count, ctime, dtime, hecMESH, fstrSOLID, fstrPARAM, is_StepFinished, contactNode)
write out restart file
This module provides main suboruitne for nonliear calculation.
subroutine table_nlsta(hecMESH, fstrSOLID, cstep, time, f_t)
This subroutine decide the loading increment considering the amplitude definition.
subroutine fstr_solve_nlgeom(hecMESH, hecMAT, fstrSOLID, hecLagMAT, fstrPARAM, conMAT)
This module provides main subroutine for nonlinear calculation.
This module provides functions to deal with time and increment of stress analysis.
real(kind=kreal) function fstr_get_timeinc()
logical function fstr_timeinc_istimepoint(stepinfo, fstrPARAM)
real(kind=kreal) function fstr_get_timeinc_base()
subroutine fstr_set_timeinc_base(dtime_base)
subroutine fstr_timeinc_settimeincrement(stepinfo, fstrPARAM, substep, NRstatI, NRstatR, AutoINC_stat, Cutback_stat)
real(kind=kreal) function fstr_get_time()
subroutine fstr_proceed_time()
subroutine fstr_timeinc_printstatus_final(success_flag)
subroutine fstr_timeinc_printstatus_init
subroutine fstr_set_time(time)
logical function fstr_timeinc_isstepfinished(stepinfo)
subroutine fstr_timeinc_printstatus(stepinfo, fstrPARAM, totstep, substep, NRstatI, NRstatR, AutoINC_stat, Cutback_stat)
This module defines common data and basic structures for analysis.
integer(kind=kint) myrank
PARALLEL EXECUTION.
integer(kind=kint), parameter imsg
integer(kind=kint), parameter kcaslagrange
contact analysis algorithm
integer(kind=kint), parameter knsmnewton
nonlinear solver method (nsm)
integer(kind=kint), parameter knsmquasinewton
integer(kind=kint), parameter kcaalagrange
subroutine table_amp(hecMESH, fstrSOLID, cstep, jj_n_amp, time, f_t)
type(fstr_param), target fstrpr
GLOBAL VARIABLE INITIALIZED IN FSTR_SETUP.
type(tinitialcondition), dimension(:), pointer, save g_initialcnd
This modules just summarizes all modules used in static analysis.
This module provides functions to output result.
subroutine fstr_static_output(cstep, istep, time, hecMESH, fstrSOLID, fstrPARAM, flag, outflag, dtime)
Output result.