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, factor
45 real(kind=kreal) :: time_1, time_2
46 logical :: 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
104 call fstr_static_output( 1, 0, 0.d0, hecmesh, fstrsolid, fstrparam, fstrparam%solution_type, .true., 0.d0 )
107 fstrsolid%FACTOR = 0.0d0
110 infoctchange%active = .true.
113 do tot_step=1, fstrsolid%nstep_tot
114 tot_step_print = tot_step+restart_step_num-1
115 if(hecmesh%my_rank==0)
write(*,*)
''
116 if(hecmesh%my_rank==0)
write(*,
'(a,i5)')
' loading step=',tot_step_print
118 if( fstrsolid%TEMP_ngrp_tot>0 )
then
119 do j=1, hecmesh%n_node
120 fstrsolid%temp_bak(j) = fstrsolid%temperature(j)
123 call fstr_updatestate( hecmesh, fstrsolid, 0.0d0 )
126 fstrsolid%unode_bak(:) = fstrsolid%unode(:)
131 sub_step = restart_substep_num
136 & fstrsolid%NRstat_i, fstrsolid%NRstat_r, fstrsolid%AutoINC_stat, fstrsolid%CutBack_stat )
137 if( fstrsolid%TEMP_irres > 0 )
then
138 fstrsolid%FACTOR(1) = 0.d0
139 fstrsolid%FACTOR(2) = 1.d0
141 fstrsolid%TEMP_FACTOR = factor
144 fstrsolid%FACTOR(1) = factor
146 fstrsolid%FACTOR(2) = factor
149 if(hecmesh%my_rank==0)
then
150 write(*,
'(A,I0,2(A,E12.4))')
' sub_step= ',sub_step,
', &
152 write(*,
'(A,2f12.7)')
' loading_factor= ', fstrsolid%FACTOR
153 if( fstrsolid%TEMP_irres > 0 )
write(*,
'(A,2f12.7)')
' readtemp_factor= ', fstrsolid%TEMP_FACTOR
156 time_1 = hecmw_wtime()
159 if( .not. is_interaction_active )
then
160 if( fstrparam%nlsolver_method ==
knsmnewton )
then
161 call fstr_newton( tot_step, hecmesh, hecmat, fstrsolid, fstrparam, &
179 & tot_step_print, sub_step, fstrsolid%NRstat_i, fstrsolid%NRstat_r, &
180 & fstrsolid%AutoINC_stat, fstrsolid%CutBack_stat )
183 if( fstrsolid%CutBack_stat == 0 )
then
188 cbbound = fstrparam%ainc(fstrsolid%step_ctrl(tot_step)%AincParam_id)%CBbound
189 if( fstrsolid%CutBack_stat == cbbound )
then
190 if( hecmesh%my_rank == 0 )
then
191 write(*,*)
'Number of successive cutback reached max number: ',cbbound
199 if( is_interaction_active )
then
206 if( hecmesh%my_rank == 0 )
write(*,*)
'### State has been restored at time =',
fstr_get_time()
209 if( sub_step == fstrsolid%step_ctrl(tot_step)%num_substep )
then
210 if( hecmesh%my_rank == 0 )
then
211 write(*,
'(a,i5,a,f6.3)')
'### Number of substeps reached max number: at total_step=', &
218 time_2 = hecmw_wtime()
219 if( hecmesh%my_rank==0)
write(
imsg,
'(a,",",2(I8,","),f10.2)') &
220 &
'step, substep, solve (sec) :', tot_step_print, sub_step, time_2 - time_1
224 if( fstrsolid%CutBack_stat > 0 )
then
226 stop hecmw_exit_noconv
231 step_count = step_count + 1
234 if( fstrsolid%restart_nout > 0)
then
235 if( mod(step_count,fstrsolid%restart_nout) == 0 )
then
247 time_2 = hecmw_wtime()
248 if( hecmesh%my_rank==0 )
then
249 write(
imsg,
'(A,",",2(I8,","),f10.2)')
'step, substep, solve (sec) :', tot_step_print, sub_step, time_2 - time_1
250 write(
imsg,
'(A,I0,",",1pE15.8)')
'### stepcount (for output), time :', step_count,
fstr_get_time()
256 if( sub_step == fstrsolid%step_ctrl(tot_step)%num_substep )
then
257 if( hecmesh%my_rank == 0 )
then
258 write(*,
'(a,i5,a,f6.3)')
'### Number of substeps reached max number: at total_step=', &
262 stop hecmw_exit_noconv
265 sub_step = sub_step + 1
269 if( fstrsolid%restart_nout > 0 )
then
271 & hecmesh,fstrsolid,fstrparam,.true.,infoctchange%contactNode_current)
273 restart_substep_num = 1
274 if( fstrsolid%TEMP_irres > 0 )
exit
282 write(
imsg,
'("### FSTR_SOLVE_NLGEOM FINISHED!")')
283 write(*,
'("### FSTR_SOLVE_NLGEOM FINISHED!")')
293 type ( hecmwST_local_mesh ),
intent(in) :: hecMESH
294 type ( fstr_solid ),
intent(in) :: fstrSOLID
295 integer(kind=kint),
intent(in) :: cstep
296 real(kind=kreal),
intent(in) :: time
297 real(kind=kreal),
intent(out) :: f_t
299 integer(kind=kint) :: jj_n_amp
301 jj_n_amp = fstrsolid%step_ctrl( cstep )%amp_id
303 if( jj_n_amp <= 0 )
then
304 f_t = (time-fstrsolid%step_ctrl(cstep)%starttime)/fstrsolid%step_ctrl(cstep)%elapsetime
305 if( f_t>1.d0 ) f_t=1.d0
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
subroutine fstr_get_amplitude(hecMESH, fstrSOLID, cstep, jj_n_amp, time, value)
Evaluate the amplitude-scaled target value a(t) for static analysis.
subroutine fstr_abort(code)
Terminate the analysis with a classified exit status. MPI_ABORT does not perform the Fortran I/O fina...
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
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.