33 real(kind=kreal),
parameter ::
pi = 3.14159265358979323846d0
40 ,fstrDYNAMIC,fstrRESULT,fstrPARAM &
41 ,fstrCPL,hecLagMAT,restart_step_num,restart_substep_num,infoCTChange &
42 ,conMAT,restart_step_count )
45 type(hecmwst_local_mesh) :: hecmesh
46 type(hecmwst_matrix) :: hecMAT
47 type(hecmwst_matrix),
pointer :: hecMAT0
50 type(hecmwst_result_data) :: fstrRESULT
54 type(hecmwst_matrix_lagrange) :: hecLagMAT
55 type(fstr_info_contactchange) :: infoCTChange
56 type(hecmwst_matrix) :: conMAT
59 integer(kind=kint) :: nnod, ndof, nn
60 integer(kind=kint) :: i, tot_step_print, CBbound
61 real(kind=kreal) :: time_1, time_2, factor
62 integer(kind=kint) :: sub_step
64 integer(kind=kint) :: restart_step_num, restart_substep_num, restart_step_count, tot_step, step_count
65 integer(kind=kint) :: ctAlgo
66 integer(kind=kint) :: max_iter_contact
67 real(kind=kreal) :: converg_dlag
68 type(fstr_info_contactchange) :: infoctchange_bak
70 logical :: is_outpoint
71 integer(kind=kint) :: n_node_global
72 logical :: is_mat_symmetric, is_interaction_active
76 is_interaction_active = (
associated( fstrsolid%contacts ) .or.
associated( fstrsolid%embeds ) )
81 n_node_global = hecmesh%nn_internal
82 call hecmw_allreduce_i1(hecmesh,n_node_global,hecmw_sum)
84 ctalgo = fstrparam%contact_algo
87 write(*,*)
' This type of direct solver is not yet available in such case ! '
88 write(*,*)
' Please use intel MKL direct solver !'
89 call hecmw_abort(hecmw_comm_get_comm())
92 hecmat%NDOF=hecmesh%n_dof
98 if(
associated( fstrsolid%contacts ) )
then
99 call initialize_contact_output_vectors(fstrsolid,hecmat)
100 call setup_contact_elesurf_for_area( 1, hecmesh, fstrsolid )
104 time_1 = hecmw_wtime()
107 if(dabs(fstrdynamic%beta) < 1.0e-20)
then
108 if( hecmesh%my_rank == 0 )
then
109 write(
imsg,*)
'stop due to Newmark-beta = 0'
111 call hecmw_abort( hecmw_comm_get_comm())
115 if(fstrdynamic%idx_mas == 1)
then
116 call setmass(fstrsolid,hecmesh,hecmat,fstreig)
119 else if(fstrdynamic%idx_mas == 2)
then
120 if( hecmesh%my_rank .eq. 0 )
then
121 write(
imsg,*)
'stop: consistent mass matrix is not yet available !'
123 call hecmw_abort( hecmw_comm_get_comm())
126 hecmat%Iarray(98) = 1
127 hecmat%Iarray(97) = 1
130 if( restart_step_num == 1 .and. fstrdynamic%VarInitialize .and. abs(fstrdynamic%ray_m) > 1.0d-15 ) &
134 if( restart_step_num == 1 )
then
139 fstrdynamic%VEC3(:) =0.d0
144 ctalgo, hecmesh, fstrsolid, infoctchange)
146 call hecmw_mat_copy_profile( hecmat, conmat )
151 elseif( hecmat%Iarray(99)==4 )
then
152 write(*,*)
' This type of direct solver is not yet available in such case ! '
153 write(*,*)
' Please change solver type to intel MKL direct solver !'
154 call hecmw_abort(hecmw_comm_get_comm())
162 fstrsolid%FACTOR = 0.0d0
166 step_count = restart_step_count
167 do tot_step=1, fstrsolid%nstep_tot
168 tot_step_print = tot_step+restart_step_num-1
169 if(hecmesh%my_rank==0)
write(*,*)
''
170 if(hecmesh%my_rank==0)
write(*,
'(a,i5)')
' loading step=',tot_step_print
172 sub_step = restart_substep_num
174 if (ndof == 4 .and. hecmesh%my_rank==0)
write(*,
'(a,i5)')
"iter: ",sub_step
177 & fstrsolid%NRstat_i, fstrsolid%NRstat_r, fstrsolid%AutoINC_stat, fstrsolid%CutBack_stat )
183 fstrdynamic, fstrparam, fstrcpl, heclagmat, infoctchange, conmat, &
184 restart_step_num, hecmat0, sub_step, fstrdynamic%t_curr, fstrdynamic%t_delta)
188 & tot_step_print, sub_step, fstrsolid%NRstat_i, fstrsolid%NRstat_r, &
189 & fstrsolid%AutoINC_stat, fstrsolid%CutBack_stat )
192 if( fstrsolid%CutBack_stat == 0 )
then
198 cbbound = fstrparam%ainc(fstrsolid%step_ctrl(tot_step)%AincParam_id)%CBbound
199 if( fstrsolid%CutBack_stat == cbbound )
then
200 if( hecmesh%my_rank == 0 )
then
201 write(*,*)
'Number of successive cutback reached max number: ',cbbound
210 if( is_interaction_active )
then
216 if( hecmesh%my_rank == 0 )
write(*,*)
'### State has been restored at time =',
fstr_get_time()
219 if( sub_step == fstrsolid%step_ctrl(tot_step)%num_substep )
then
220 if( hecmesh%my_rank == 0 )
then
221 write(*,
'(a,i5,a,f6.3)')
'### Number of substeps reached max number: at total_step=', &
228 time_2 = hecmw_wtime()
229 if( hecmesh%my_rank==0)
write(
imsg,
'(a,",",2(I8,","),f10.2)') &
230 &
'step, substep, solve (sec) :', tot_step_print, sub_step, time_2 - time_1
234 if( fstrsolid%CutBack_stat > 0 )
then
236 stop hecmw_exit_noconv
242 step_count = step_count + 1
248 call fstr_dynamic_output(tot_step, step_count, fstrdynamic%t_curr, hecmesh, fstrsolid, fstrdynamic, fstrparam, is_outpoint)
251 call dynamic_output_monit(tot_step, i, fstrdynamic%t_curr, hecmesh, fstrparam, fstrdynamic, fstreig, fstrsolid)
254 if( fstrdynamic%restart_nout > 0 )
then
255 if( mod(step_count,fstrdynamic%restart_nout).eq.0 )
then
257 .false.,infoctchange%contactNode_current,step_count)
264 if( sub_step == fstrsolid%step_ctrl(tot_step)%num_substep )
then
265 if( hecmesh%my_rank == 0 )
then
266 write(*,
'(a,i5,a,f6.3)')
'### Number of substeps reached max number: at total_step=', &
270 stop hecmw_exit_noconv
273 sub_step = sub_step + 1
277 if( fstrdynamic%restart_nout > 0 )
then
279 .true.,infoctchange%contactNode_current,step_count)
282 restart_substep_num = 1
286 if (
associated(hecmat0))
then
287 call hecmw_mat_finalize(hecmat0)
292 if( hecmesh%my_rank == 0 )
then
294 write(
imsg,
'("### FSTR_SOLVE_NLGEOM FINISHED!")')
295 write(*,
'("### FSTR_SOLVE_NLGEOM FINISHED!")')
301 fstrDYNAMIC, fstrPARAM, fstrCPL, hecLagMAT, infoCTChange, conMAT, &
302 restart_step_num, hecMAT0, istep, t_curr, t_delta)
305 integer(kind=kint),
intent(in) :: cstep, restart_step_num, istep
306 real(kind=kreal),
intent(in) :: t_curr, t_delta
307 type(hecmwst_local_mesh) :: hecmesh
308 type(hecmwst_matrix) :: hecMAT
309 type(hecmwst_matrix),
pointer :: hecMAT0
315 type(hecmwst_matrix_lagrange) :: hecLagMAT
316 type(fstr_info_contactchange) :: infoCTChange
317 type(hecmwst_matrix) :: conMAT
320 type(hecmwst_ebc) :: hecEBC
321 integer(kind=kint) :: j, kk, idm, imm
322 integer(kind=kint) :: iter
323 real(kind=kreal) :: a1, a2, a3, b1, b2, b3, c1, c2
324 real(kind=kreal) :: coef(6)
325 integer(kind=kint) :: count_step, stepcnt
326 integer(kind=kint) :: contact_changed_global
327 logical :: is_mat_symmetric
330 integer(kind=kint) :: ctAlgo, max_iter_contact
331 integer(kind=kint) :: nnod, ndof, nn
332 real(kind=kreal),
allocatable :: coord(:)
333 integer(kind=kint) :: iterStatus, nresid
334 real(kind=kreal),
allocatable :: resid_work(:)
335 type(fstr_convergence_state) :: cnvstat
337 fstrsolid%NRstat_i(:) = 0
340 ctalgo = fstrparam%contact_algo
341 max_iter_contact = fstrsolid%step_ctrl(cstep)%max_contiter
342 nnod = hecmesh%n_node
345 allocate(coord(hecmesh%n_node*ndof))
346 allocate(resid_work(hecmesh%n_node*ndof + conmat%NP*ndof))
348 a1 = .5d0/fstrdynamic%beta - 1.d0
349 a2 = 1.d0/(fstrdynamic%beta*t_delta)
350 a3 = 1.d0/(fstrdynamic%beta*t_delta*t_delta)
351 b1 = ( .5d0*fstrdynamic%gamma/fstrdynamic%beta - 1.d0 )*t_delta
352 b2 = fstrdynamic%gamma/fstrdynamic%beta - 1.d0
353 b3 = fstrdynamic%gamma/(fstrdynamic%beta*t_delta)
354 c1 = 1.d0 + fstrdynamic%ray_k*b3
355 c2 = a3 + fstrdynamic%ray_m*b3
357 coef(1) = a1; coef(2) = a2; coef(3) = a3
358 coef(4) = b1; coef(5) = b2; coef(6) = b3
360 if(hecmesh%my_rank==0)
then
361 write(*,
'(A)')
'-------------------------------------------------'
362 write(*,
'('' time step='',i10,'' time='',1pe13.4e3)') istep,t_curr
366 fstrdynamic%VEC1(j) = a1*fstrdynamic%ACC(j,1) + a2*fstrdynamic%VEL(j,1)
367 fstrdynamic%VEC2(j) = b1*fstrdynamic%ACC(j,1) + b2*fstrdynamic%VEL(j,1)
375 fstrsolid%dunode(:) =0.d0
379 loopforcontactanalysis:
do while( .true. )
380 count_step = count_step + 1
383 do iter = 1, fstrsolid%step_ctrl(cstep)%max_iter
390 call dynamic_mat_ass_load (cstep, t_curr+t_delta, hecmesh, hecmat, fstrsolid, fstrdynamic, fstrparam, iter )
391 do j=1, hecmesh%n_node* hecmesh%n_dof
392 hecmat%B(j) = hecmat%B(j) - fstrsolid%QFORCE(j) + fstrsolid%DFORCE(j)
399 & fstrparam, fstrdynamic, fstrcpl, restart_step_num, istep)
403 call hecmw_mat_clear( conmat )
404 call hecmw_mat_clear_b( conmat )
415 & fstrparam, heclagmat, hecebc, t_curr+t_delta, stepcnt, conmat=conmat)
417 & fstrparam, heclagmat, hecebc, t_curr+t_delta, stepcnt, conmat=conmat)
419 & fstrparam, heclagmat, hecebc, t_curr+t_delta, stepcnt, conmat=conmat)
422 do j = 1, hecmat%NP*ndof
423 if( hecebc%mark(j) == 0 ) cycle
424 hecmat%B(j) = hecebc%val(j)
432 ndof, iter, istep, cstep, &
433 resid_work, cnvstat, iterstatus, heclagmat)
436 fstrsolid%NRstat_i(knstciter) = count_step
449 fstrsolid%NRstat_i(knstciter) = count_step
454 call hecmw_update_r (hecmesh, hecmat%X, hecmat%NP, hecmat%NDOF)
457 do j=1,hecmesh%n_node*ndof
458 fstrsolid%dunode(j) = fstrsolid%dunode(j)+hecmat%X(j)
461 & t_delta,iter, fstrdynamic%strainEnergy )
474 do j=1,heclagmat%num_lagrange
475 heclagmat%lagrange(j) = heclagmat%lagrange(j) + hecmat%X(hecmesh%n_node*ndof+j)
479 if(.not. fstrparam%nlgeom)
exit
482 fstrsolid%NRstat_i(knstmaxit) = max(fstrsolid%NRstat_i(knstmaxit),iter)
483 fstrsolid%NRstat_i(knstsumit) = fstrsolid%NRstat_i(knstsumit) + iter
490 hecmesh, fstrsolid, infoctchange)
493 write(*,*)
' This type of direct solver is not yet available in such case ! '
494 write(*,*)
' Please use intel MKL direct solver !'
495 call hecmw_abort(hecmw_comm_get_comm())
499 contact_changed_global=0
501 exit loopforcontactanalysis
504 contact_changed_global=1
506 call hecmw_allreduce_i1(hecmesh,contact_changed_global,hecmw_max)
507 if (contact_changed_global > 0)
then
508 call hecmw_mat_clear_b( hecmat )
509 call hecmw_mat_clear_b( conmat )
513 if( count_step > max_iter_contact )
exit loopforcontactanalysis
516 if( count_step >= fstrsolid%step_ctrl(cstep)%max_contiter )
then
517 if( hecmesh%my_rank == 0)
then
518 write( *,
'(a,i5,a,i5)')
' ### Contact failed to Converge : at total_step=', cstep,
' sub_step=', istep
520 fstrsolid%NRstat_i(knstciter) = count_step
521 fstrsolid%CutBack_stat = fstrsolid%CutBack_stat + 1
522 fstrsolid%NRstat_i(knstdresn) = 3
526 enddo loopforcontactanalysis
528 fstrsolid%NRstat_i(knstciter) = count_step
532 & fstrparam, fstrdynamic, fstrcpl, a1, a2, a3, b1, b2, b3, istep, is_cycle)
538 fstrdynamic%kineticEnergy = 0.0d0
540 fstrdynamic%ACC (j,2) = -a1*fstrdynamic%ACC(j,1) - a2*fstrdynamic%VEL(j,1) + &
541 a3*fstrsolid%dunode(j)
542 fstrdynamic%VEL (j,2) = -b1*fstrdynamic%ACC(j,1) - b2*fstrdynamic%VEL(j,1) + &
543 b3*fstrsolid%dunode(j)
544 fstrdynamic%ACC (j,1) = fstrdynamic%ACC (j,2)
545 fstrdynamic%VEL (j,1) = fstrdynamic%VEL (j,2)
547 fstrsolid%unode(j) = fstrsolid%unode(j)+fstrsolid%dunode(j)
548 fstrdynamic%DISP(j,2) = fstrsolid%unode(j)
550 fstrdynamic%kineticEnergy = fstrdynamic%kineticEnergy + &
551 0.5d0*fstreig%mass(j)*fstrdynamic%VEL(j,2)*fstrdynamic%VEL(j,2)
558 deallocate(resid_work)
559 fstrsolid%CutBack_stat = 0
566 if( fstrparam%fg_couple == 1)
then
567 if( fstrparam%fg_couple_type==1 .or. &
568 fstrparam%fg_couple_type==3 .or. &
574 & fstrPARAM, fstrDYNAMIC, fstrCPL, restart_step_num, i)
576 type(hecmwst_local_mesh) :: hecMESH
577 type(hecmwst_matrix) :: hecMAT
582 integer(kint) :: kkk0, kkk1, j, kk, i, restart_step_num
585 if( fstrparam%fg_couple == 1)
then
586 if( fstrparam%fg_couple_first /= 0 )
then
587 bsize = dfloat( i ) / dfloat( fstrparam%fg_couple_first )
588 if( bsize > 1.0 ) bsize = 1.0
589 do kkk0 = 1, fstrcpl%coupled_node_n
591 fstrcpl%trac(kkk1-2) = bsize * fstrcpl%trac(kkk1-2)
592 fstrcpl%trac(kkk1-1) = bsize * fstrcpl%trac(kkk1-1)
593 fstrcpl%trac(kkk1 ) = bsize * fstrcpl%trac(kkk1 )
596 if( fstrparam%fg_couple_window > 0 )
then
597 j = i - restart_step_num + 1
598 kk = fstrdynamic%n_step - restart_step_num + 1
599 bsize = 0.5*(1.0-cos(2.0*
pi*dfloat(j)/dfloat(kk)))
600 do kkk0 = 1, fstrcpl%coupled_node_n
602 fstrcpl%trac(kkk1-2) = bsize * fstrcpl%trac(kkk1-2)
603 fstrcpl%trac(kkk1-1) = bsize * fstrcpl%trac(kkk1-1)
604 fstrcpl%trac(kkk1 ) = bsize * fstrcpl%trac(kkk1 )
612 & fstrPARAM, fstrDYNAMIC, fstrCPL, a1, a2, a3, b1, b2, b3, i, is_cycle)
614 type(hecmwst_local_mesh) :: hecMESH
615 type(hecmwst_matrix) :: hecMAT
620 integer(kint) :: kkk0, kkk1, j, i, revocap_flag
621 real(kreal) :: a1, a2, a3, b1, b2, b3
626 if( fstrparam%fg_couple == 1 )
then
627 if( fstrparam%fg_couple_type>1 )
then
628 do j=1, fstrcpl%coupled_node_n
629 if( fstrcpl%dof == 3 )
then
631 kkk1 = fstrcpl%coupled_node(j)*3
633 fstrcpl%disp (kkk0-2) = fstrsolid%unode(kkk1-2) + fstrsolid%dunode(kkk1-2)
634 fstrcpl%disp (kkk0-1) = fstrsolid%unode(kkk1-1) + fstrsolid%dunode(kkk1-1)
635 fstrcpl%disp (kkk0 ) = fstrsolid%unode(kkk1 ) + fstrsolid%dunode(kkk1 )
637 fstrcpl%velo (kkk0-2) = -b1*fstrdynamic%ACC(kkk1-2,1) - b2*fstrdynamic%VEL(kkk1-2,1) + &
638 b3*fstrsolid%dunode(kkk1-2)
639 fstrcpl%velo (kkk0-1) = -b1*fstrdynamic%ACC(kkk1-1,1) - b2*fstrdynamic%VEL(kkk1-1,1) + &
640 b3*fstrsolid%dunode(kkk1-1)
641 fstrcpl%velo (kkk0 ) = -b1*fstrdynamic%ACC(kkk1,1) - b2*fstrdynamic%VEL(kkk1,1) + &
642 b3*fstrsolid%dunode(kkk1)
643 fstrcpl%accel(kkk0-2) = -a1*fstrdynamic%ACC(kkk1-2,1) - a2*fstrdynamic%VEL(kkk1-2,1) + &
644 a3*fstrsolid%dunode(kkk1-2)
645 fstrcpl%accel(kkk0-1) = -a1*fstrdynamic%ACC(kkk1-1,1) - a2*fstrdynamic%VEL(kkk1-1,1) + &
646 a3*fstrsolid%dunode(kkk1-1)
647 fstrcpl%accel(kkk0 ) = -a1*fstrdynamic%ACC(kkk1,1) - a2*fstrdynamic%VEL(kkk1,1) + &
648 a3*fstrsolid%dunode(kkk1)
651 kkk1 = fstrcpl%coupled_node(j)*2
653 fstrcpl%disp (kkk0-1) = fstrsolid%unode(kkk1-1) + fstrsolid%dunode(kkk1-1)
654 fstrcpl%disp (kkk0 ) = fstrsolid%unode(kkk1 ) + fstrsolid%dunode(kkk1 )
656 fstrcpl%velo (kkk0-1) = -b1*fstrdynamic%ACC(kkk1-1,1) - b2*fstrdynamic%VEL(kkk1-1,1) + &
657 b3*fstrsolid%dunode(kkk1-1)
658 fstrcpl%velo (kkk0 ) = -b1*fstrdynamic%ACC(kkk1,1) - b2*fstrdynamic%VEL(kkk1,1) + &
659 b3*fstrsolid%dunode(kkk1)
660 fstrcpl%accel(kkk0-1) = -a1*fstrdynamic%ACC(kkk1-1,1) - a2*fstrdynamic%VEL(kkk1-1,1) + &
661 a3*fstrsolid%dunode(kkk1-1)
662 fstrcpl%accel(kkk0 ) = -a1*fstrdynamic%ACC(kkk1,1) - a2*fstrdynamic%VEL(kkk1,1) + &
663 a3*fstrsolid%dunode(kkk1)
669 select case ( fstrparam%fg_couple_type )
674 if( revocap_flag==0 ) is_cycle = .true.
677 if( revocap_flag==0 )
then
This module contains subroutines for nonlinear implicit dynamic analysis.
subroutine fstr_solve_nlgeom_dynamic_implicit_contactslag(hecMESH, hecMAT, fstrSOLID, fstrEIG, fstrDYNAMIC, fstrRESULT, fstrPARAM, fstrCPL, hecLagMAT, restart_step_num, restart_substep_num, infoCTChange, conMAT, restart_step_count)
This subroutine provides function of nonlinear implicit dynamic analysis using the Newmark method....
subroutine fstr_solve_dynamic_nlimplicit_couple_init(fstrPARAM, fstrCPL)
subroutine fstr_solve_dynamic_nlimplicit_couple_pre(hecMESH, hecMAT, fstrSOLID, fstrPARAM, fstrDYNAMIC, fstrCPL, restart_step_num, i)
subroutine fstr_solve_dynamic_nlimplicit_couple_post(hecMESH, hecMAT, fstrSOLID, fstrPARAM, fstrDYNAMIC, fstrCPL, a1, a2, a3, b1, b2, b3, i, is_cycle)
real(kind=kreal), parameter pi
subroutine fstr_newton_dynamic_contactslag(cstep, hecMESH, hecMAT, fstrSOLID, fstrEIG, fstrDYNAMIC, fstrPARAM, fstrCPL, hecLagMAT, infoCTChange, conMAT, restart_step_num, hecMAT0, istep, t_curr, t_delta)
Essential boundary conditions kept as per-DOF marks and values so that they can be imposed on the mat...
subroutine, public hecmw_ebc_init(hecMAT, hecEBC)
subroutine, public hecmw_ebc_finalize(hecEBC)
This module provides functions to initialize variables when initial velocity or acceleration boundary...
subroutine dynamic_init_varibles(hecMESH, hecMAT, fstrSOLID, fstrEIG, fstrDYNAMIC, fstrPARAM)
This module contains functions to set acceleration boundary condition in dynamic analysis.
subroutine dynamic_mat_ass_bc_ac(cstep, hecMESH, hecMAT, fstrSOLID, fstrDYNAMIC, fstrPARAM, hecLagMAT, hecEBC, t_curr, iter, conMAT)
This subrouitne set acceleration boundary condition in dynamic analysis.
This module contains functions to set velocity boundary condition in dynamic analysis.
subroutine dynamic_mat_ass_bc_vl(cstep, hecMESH, hecMAT, fstrSOLID, fstrDYNAMIC, fstrPARAM, hecLagMAT, hecEBC, t_curr, iter, conMAT)
This subrouitne set velocity boundary condition in dynamic analysis.
This module contains functions to set displacement boundary condition in dynamic analysis.
subroutine dynamic_mat_ass_bc(cstep, hecMESH, hecMAT, fstrSOLID, fstrDYNAMIC, fstrPARAM, hecLagMAT, hecEBC, t_curr, iter, conMAT)
This subroutine setup disp bundary condition.
This module contains functions relates to coupling analysis.
subroutine dynamic_mat_ass_couple(hecMESH, hecMAT, fstrSOLID, fstrCPL)
This module contains function to set boundary condition of external load in dynamic analysis.
subroutine dynamic_mat_ass_load(cstep, t_curr, hecMESH, hecMAT, fstrSOLID, fstrDYNAMIC, fstrPARAM, iter)
This function sets boundary condition of external load.
This module provides functions to output result.
subroutine fstr_dynamic_output(cstep, istep, t_curr, hecMESH, fstrSOLID, fstrDYNAMIC, fstrPARAM, outflag)
Output result.
subroutine dynamic_output_monit(cstep, istep, t_curr, hecMESH, fstrPARAM, fstrDYNAMIC, fstrEIG, fstrSOLID)
This module assembles the tangent stiffness matrix and, in the implicit dynamic case,...
subroutine, public fstr_creatematrix_and_dampingforce(hecMESH, hecMAT, fstrSOLID, time, tincr, fstrDYNAMIC, coef)
Assemble the system matrix and, optionally, the dynamic damping force.
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.
logical function fstr_cutback_active()
Set up lumped mass matrix.
subroutine setmass(fstrSOLID, hecMESH, hecMAT, fstrEIG)
This module provides a unified convergence check for Newton iteration.
subroutine, public fstr_check_linear_solver(hecMESH, hecMAT, fstrSOLID, cstep, sub_step, iterStatus, istat)
Classify the linear solver result and record why the solve failed.
subroutine, public fstr_check_convergence(hecMESH, hecMAT, fstrSOLID, fstrPR, ndof, iter, sub_step, cstep, residual_vec, cnvstat, iterStatus, hecLagMAT)
Wrapper that calls fstr_check_convergence_main and applies the common divergence/NaN handling (status...
subroutine, public fstr_rcap_send(fstrCPL)
subroutine, public fstr_rcap_get(fstrCPL)
subroutine fstr_get_convergence(revocap_flag)
This module provides function to calculate residual of nodal force.
subroutine, public fstr_update_ndforce_mpc(hecMESH, B)
subroutine, public fstr_assemble_residual_contact(hecMAT, hecLagMAT, conMAT, hecMESH, resid_vec, nresid)
Assemble contact residual vector (hecMATB + conMATB + Lagrange) into a single vector.
subroutine, public fstr_update_reaction_spc(cstep, hecMESH, fstrSOLID)
Set fstrSOLIDREACTION at constrained DOFs using current fstrSOLIDQFORCE. Constrained DOFs are enumera...
This module provides functions to read in and write out restart files.
subroutine fstr_write_restart_dyna_nl(cstep, substep, hecMESH, fstrSOLID, fstrDYNAMIC, fstrPARAM, is_StepFinished, contactNode, step_count)
write out restart file for nonlinear dynamic analysis
This module provides functions to deal with spring force.
subroutine fstr_update_ndforce_spring(cstep, hecMESH, fstrSOLID, B)
subroutine fstr_addspring(cstep, hecMESH, hecMAT, fstrSOLID, fstrPARAM)
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)
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
logical function fstr_timeinc_isstepfinished(stepinfo)
subroutine fstr_timeinc_printstatus(stepinfo, fstrPARAM, totstep, substep, NRstatI, NRstatR, AutoINC_stat, Cutback_stat)
This module provides function to calculate to do updates.
subroutine fstr_updatestate(hecMESH, fstrSOLID, tincr)
Update elastiplastic status.
subroutine fstr_updatenewton(hecMESH, hecMAT, fstrSOLID, time, tincr, iter, strainEnergy)
Update displacement, stress, strain and internal forces.
This module defines common data and basic structures for analysis.
subroutine fstr_recover_initial_config_to_mesh(hecMESH, fstrSOLID, coord)
integer(kind=kint), parameter imsg
integer(kind=kint), parameter kitrfloatingerror
integer(kind=kint), parameter kitrconverged
subroutine fstr_abort(code)
Terminate the analysis with a classified exit status. MPI_ABORT does not perform the Fortran I/O fina...
subroutine fstr_set_current_config_to_mesh(hecMESH, fstrSOLID, coord)
type(fstr_param), target fstrpr
GLOBAL VARIABLE INITIALIZED IN FSTR_SETUP.
integer(kind=kint), parameter kitrcontinue
iteration control
integer(kind=kint), parameter kitrdiverged
Data for coupling analysis.
Data for DYNAMIC ANSLYSIS (fstrDYNAMIC)
Package of data used by Lanczos eigenvalue solver.
FSTR INNER CONTROL PARAMETERS (fstrPARAM)