33 real(kind=kreal),
parameter ::
pi = 3.14159265358979323846d0
40 ,fstrDYNAMIC,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
53 type(hecmwst_matrix_lagrange) :: hecLagMAT
54 type(fstr_info_contactchange) :: infoCTChange
55 type(hecmwst_matrix) :: conMAT
58 integer(kind=kint) :: nnod, ndof, nn
59 integer(kind=kint) :: tot_step_print, CBbound
60 real(kind=kreal) :: time_1, time_2
61 integer(kind=kint) :: sub_step
63 integer(kind=kint) :: restart_step_num, restart_substep_num, restart_step_count, tot_step, step_count
64 integer(kind=kint) :: ctAlgo
65 type(fstr_info_contactchange) :: infoCTChange_bak
67 logical :: is_OutPoint
68 integer(kind=kint) :: n_node_global
69 logical :: is_mat_symmetric, is_interaction_active
73 is_interaction_active = (
associated( fstrsolid%contacts ) .or.
associated( fstrsolid%embeds ) )
78 n_node_global = hecmesh%nn_internal
79 call hecmw_allreduce_i1(hecmesh,n_node_global,hecmw_sum)
81 ctalgo = fstrparam%contact_algo
84 write(*,*)
' This type of direct solver is not yet available in such case ! '
85 write(*,*)
' Please use intel MKL direct solver !'
86 call hecmw_abort(hecmw_comm_get_comm())
89 hecmat%NDOF=hecmesh%n_dof
95 if(
associated( fstrsolid%contacts ) )
then
96 call initialize_contact_output_vectors(fstrsolid,hecmat)
97 call setup_contact_elesurf_for_area( hecmesh, fstrsolid )
101 time_1 = hecmw_wtime()
104 if(dabs(fstrdynamic%beta) < 1.0e-20)
then
105 if( hecmesh%my_rank == 0 )
then
106 write(
imsg,*)
'stop due to Newmark-beta = 0'
108 call hecmw_abort( hecmw_comm_get_comm())
111 call setmass(fstrsolid,hecmesh,hecmat,fstreig)
114 hecmat%Iarray(98) = 1
115 hecmat%Iarray(97) = 1
118 if( restart_step_num == 1 .and. fstrdynamic%VarInitialize .and. abs(fstrdynamic%ray_m) > 1.0d-15 )
then
121 if( hecmesh%my_rank == 0 )
then
122 write(
imsg,*)
'stop: initial velocity or acceleration with mass-proportional damping'// &
123 ' is not available for consistent mass matrix !'
125 call hecmw_abort( hecmw_comm_get_comm())
131 if( fstrdynamic%idx_eqa == 2 .and. restart_step_num == 1 .and. restart_substep_num == 1 )
then
132 call fstr_calc_mass_product( hecmesh, fstrsolid, fstrdynamic, fstrdynamic%ACC(:,1), fstrdynamic%HHT_FORCE )
136 if( restart_step_num == 1 )
then
138 hecmesh, fstrsolid, fstrdynamic, fstrdynamic%VEL(:,1))
143 fstrdynamic%VEC3(:) =0.d0
148 ctalgo, hecmesh, fstrsolid, infoctchange)
150 call hecmw_mat_copy_profile( hecmat, conmat )
155 elseif( hecmat%Iarray(99)==4 )
then
156 write(*,*)
' This type of direct solver is not yet available in such case ! '
157 write(*,*)
' Please change solver type to intel MKL direct solver !'
158 call hecmw_abort(hecmw_comm_get_comm())
166 fstrsolid%FACTOR = 0.0d0
170 step_count = restart_step_count
171 do tot_step=1, fstrsolid%nstep_tot
172 tot_step_print = tot_step+restart_step_num-1
173 if(hecmesh%my_rank==0)
write(*,*)
''
174 if(hecmesh%my_rank==0)
write(*,
'(a,i5)')
' loading step=',tot_step_print
176 sub_step = restart_substep_num
178 if (ndof == 4 .and. hecmesh%my_rank==0)
write(*,
'(a,i5)')
"iter: ",sub_step
186 fstrdynamic, fstrparam, fstrcpl, heclagmat, infoctchange, conmat, &
187 restart_step_num, hecmat0, sub_step, fstrdynamic%t_curr, fstrdynamic%t_delta)
191 & tot_step_print, sub_step, fstrsolid )
194 if( fstrsolid%CutBack_stat == 0 )
then
200 cbbound = fstrparam%ainc(fstrsolid%step_ctrl(tot_step)%AincParam_id)%CBbound
201 if( fstrsolid%CutBack_stat == cbbound )
then
202 if( hecmesh%my_rank == 0 )
then
203 write(*,*)
'Number of successive cutback reached max number: ',cbbound
212 if( is_interaction_active )
then
218 if( hecmesh%my_rank == 0 )
write(*,*)
'### State has been restored at time =',
fstr_get_time()
221 if( sub_step == fstrsolid%step_ctrl(tot_step)%num_substep )
then
222 if( hecmesh%my_rank == 0 )
then
223 write(*,
'(a,i5,a,f6.3)')
'### Number of substeps reached max number: at total_step=', &
230 time_2 = hecmw_wtime()
231 if( hecmesh%my_rank==0)
write(
imsg,
'(a,",",2(I8,","),f10.2)') &
232 &
'step, substep, solve (sec) :', tot_step_print, sub_step, time_2 - time_1
236 if( fstrsolid%CutBack_stat > 0 )
then
238 stop hecmw_exit_noconv
244 step_count = step_count + 1
250 call fstr_dynamic_output(tot_step, step_count, fstrdynamic%t_curr, hecmesh, fstrsolid, fstrdynamic, fstrparam, is_outpoint)
253 call dynamic_output_monit(tot_step, sub_step, fstrdynamic%t_curr, hecmesh, fstrdynamic, fstreig, fstrsolid)
256 if( fstrdynamic%restart_nout > 0 )
then
257 if( mod(step_count,fstrdynamic%restart_nout).eq.0 )
then
259 .false.,infoctchange%contactNode_current,step_count)
266 if( sub_step == fstrsolid%step_ctrl(tot_step)%num_substep )
then
267 if( hecmesh%my_rank == 0 )
then
268 write(*,
'(a,i5,a,f6.3)')
'### Number of substeps reached max number: at total_step=', &
272 stop hecmw_exit_noconv
275 sub_step = sub_step + 1
279 if( fstrdynamic%restart_nout > 0 )
then
281 .true.,infoctchange%contactNode_current,step_count)
284 restart_substep_num = 1
288 if (
associated(hecmat0))
then
289 call hecmw_mat_finalize(hecmat0)
294 if( hecmesh%my_rank == 0 )
then
296 write(
imsg,
'("### FSTR_SOLVE_NLGEOM FINISHED!")')
297 write(*,
'("### FSTR_SOLVE_NLGEOM FINISHED!")')
303 fstrDYNAMIC, fstrPARAM, fstrCPL, hecLagMAT, infoCTChange, conMAT, &
304 restart_step_num, hecMAT0, istep, t_curr, t_delta)
307 integer(kind=kint),
intent(in) :: cstep, restart_step_num, istep
308 real(kind=kreal),
intent(in) :: t_curr, t_delta
309 type(hecmwst_local_mesh) :: hecmesh
310 type(hecmwst_matrix) :: hecMAT
311 type(hecmwst_matrix),
pointer :: hecMAT0
316 type(hecmwst_matrix_lagrange) :: hecLagMAT
317 type(fstr_info_contactchange) :: infoCTChange
318 type(hecmwst_matrix) :: conMAT
321 type(hecmwst_ebc) :: hecEBC
322 integer(kind=kint) :: j
323 integer(kind=kint) :: iter
324 real(kind=kreal) :: a1, a2, a3, b1, b2, b3, c1, c2
325 real(kind=kreal) :: coef(6)
326 real(kind=kreal) :: hht_prev
327 integer(kind=kint) :: count_step, stepcnt
328 integer(kind=kint) :: contact_changed_global
329 logical :: is_mat_symmetric
332 integer(kind=kint) :: ctAlgo, max_iter_contact
333 integer(kind=kint) :: nnod, ndof, nn
334 real(kind=kreal),
allocatable :: coord(:)
335 integer(kind=kint) :: iterStatus, nresid
336 real(kind=kreal),
allocatable :: resid_work(:)
337 real(kind=kreal),
allocatable :: mass_acc(:)
338 type(fstr_convergence_state) :: cnvstat
340 fstrsolid%NRstat_i(:) = 0
343 ctalgo = fstrparam%contact_algo
344 max_iter_contact = fstrsolid%step_ctrl(cstep)%max_contiter
345 nnod = hecmesh%n_node
348 allocate(coord(hecmesh%n_node*ndof))
349 allocate(resid_work(hecmesh%n_node*ndof + conmat%NP*ndof))
351 a1 = .5d0/fstrdynamic%beta - 1.d0
352 a2 = 1.d0/(fstrdynamic%beta*t_delta)
353 a3 = 1.d0/(fstrdynamic%beta*t_delta*t_delta)
354 b1 = ( .5d0*fstrdynamic%gamma/fstrdynamic%beta - 1.d0 )*t_delta
355 b2 = fstrdynamic%gamma/fstrdynamic%beta - 1.d0
356 b3 = fstrdynamic%gamma/(fstrdynamic%beta*t_delta)
357 c1 = 1.d0 + fstrdynamic%ray_k*b3
358 c2 = a3 + fstrdynamic%ray_m*b3
360 coef(1) = a1; coef(2) = a2; coef(3) = a3
361 coef(4) = b1; coef(5) = b2; coef(6) = b3
365 if( fstrdynamic%idx_eqa == 2 ) hht_prev = fstrdynamic%alpha/(1.0d0+fstrdynamic%alpha)
367 if(hecmesh%my_rank==0)
then
368 write(*,
'(A)')
'-------------------------------------------------'
369 write(*,
'('' time step='',i10,'' time='',1pe13.4e3)') istep,t_curr
373 fstrdynamic%VEC1(j) = a1*fstrdynamic%ACC(j,1) + a2*fstrdynamic%VEL(j,1)
374 fstrdynamic%VEC2(j) = b1*fstrdynamic%ACC(j,1) + b2*fstrdynamic%VEL(j,1)
382 fstrsolid%dunode(:) =0.d0
386 loopforcontactanalysis:
do while( .true. )
387 count_step = count_step + 1
390 do iter = 1, fstrsolid%step_ctrl(cstep)%max_iter
397 call dynamic_mat_ass_load (cstep, t_curr+t_delta, hecmesh, hecmat, fstrsolid, fstrdynamic, fstrparam, iter )
398 do j=1, hecmesh%n_node* hecmesh%n_dof
399 hecmat%B(j) = hecmat%B(j) - fstrsolid%QFORCE(j) + fstrsolid%DFORCE(j)
401 if( fstrdynamic%idx_eqa == 2 )
then
402 do j=1, hecmesh%n_node* hecmesh%n_dof
403 hecmat%B(j) = hecmat%B(j) - hht_prev*fstrdynamic%HHT_FORCE(j)
411 & fstrparam, fstrdynamic, fstrcpl, restart_step_num, istep)
415 call hecmw_mat_clear( conmat )
416 call hecmw_mat_clear_b( conmat )
427 & fstrparam, heclagmat, hecebc, t_curr+t_delta, stepcnt, conmat=conmat)
429 & fstrparam, heclagmat, hecebc, t_curr+t_delta, stepcnt, conmat=conmat)
431 & fstrparam, heclagmat, hecebc, t_curr+t_delta, stepcnt, conmat=conmat)
434 do j = 1, hecmat%NP*ndof
435 if( hecebc%mark(j) == 0 ) cycle
436 hecmat%B(j) = hecebc%val(j)
444 ndof, iter, istep, cstep, &
445 resid_work, cnvstat, iterstatus, heclagmat)
448 fstrsolid%NRstat_i(knstciter) = count_step
461 fstrsolid%NRstat_i(knstciter) = count_step
466 call hecmw_update_r (hecmesh, hecmat%X, hecmat%NP, hecmat%NDOF)
469 do j=1,hecmesh%n_node*ndof
470 fstrsolid%dunode(j) = fstrsolid%dunode(j)+hecmat%X(j)
473 & t_delta,iter, fstrdynamic%strainEnergy )
486 do j=1,heclagmat%num_lagrange
487 heclagmat%lagrange(j) = heclagmat%lagrange(j) + hecmat%X(hecmesh%n_node*ndof+j)
491 if(.not. fstrparam%nlgeom)
exit
494 fstrsolid%NRstat_i(knstmaxit) = max(fstrsolid%NRstat_i(knstmaxit),iter)
495 fstrsolid%NRstat_i(knstsumit) = fstrsolid%NRstat_i(knstsumit) + iter
502 hecmesh, fstrsolid, infoctchange)
505 write(*,*)
' This type of direct solver is not yet available in such case ! '
506 write(*,*)
' Please use intel MKL direct solver !'
507 call hecmw_abort(hecmw_comm_get_comm())
511 contact_changed_global=0
513 exit loopforcontactanalysis
516 contact_changed_global=1
518 call hecmw_allreduce_i1(hecmesh,contact_changed_global,hecmw_max)
519 if (contact_changed_global > 0)
then
520 call hecmw_mat_clear_b( hecmat )
521 call hecmw_mat_clear_b( conmat )
525 if( count_step > max_iter_contact )
exit loopforcontactanalysis
528 if( count_step >= fstrsolid%step_ctrl(cstep)%max_contiter )
then
529 if( hecmesh%my_rank == 0)
then
530 write( *,
'(a,i5,a,i5)')
' ### Contact failed to Converge : at total_step=', cstep,
' sub_step=', istep
532 fstrsolid%NRstat_i(knstciter) = count_step
533 fstrsolid%CutBack_stat = fstrsolid%CutBack_stat + 1
534 fstrsolid%NRstat_i(knstdresn) = 3
538 enddo loopforcontactanalysis
540 fstrsolid%NRstat_i(knstciter) = count_step
544 & fstrparam, fstrdynamic, fstrcpl, a1, a2, a3, b1, b2, b3, istep, is_cycle)
550 fstrdynamic%kineticEnergy = 0.0d0
552 fstrdynamic%ACC (j,2) = -a1*fstrdynamic%ACC(j,1) - a2*fstrdynamic%VEL(j,1) + &
553 a3*fstrsolid%dunode(j)
554 fstrdynamic%VEL (j,2) = -b1*fstrdynamic%ACC(j,1) - b2*fstrdynamic%VEL(j,1) + &
555 b3*fstrsolid%dunode(j)
556 fstrdynamic%ACC (j,1) = fstrdynamic%ACC (j,2)
557 fstrdynamic%VEL (j,1) = fstrdynamic%VEL (j,2)
559 fstrsolid%unode(j) = fstrsolid%unode(j)+fstrsolid%dunode(j)
560 fstrdynamic%DISP(j,2) = fstrsolid%unode(j)
563 hecmesh, fstrsolid, fstrdynamic, fstrdynamic%VEL(:,2))
564 if( fstrdynamic%idx_eqa == 2 )
then
565 allocate(mass_acc(ndof*nnod))
568 fstrdynamic%HHT_FORCE(j) = (mass_acc(j) + fstrdynamic%alpha*fstrdynamic%HHT_FORCE(j)) &
569 /(1.0d0+fstrdynamic%alpha)
578 deallocate(resid_work)
579 fstrsolid%CutBack_stat = 0
586 if( fstrparam%fg_couple == 1)
then
587 if( fstrparam%fg_couple_type==1 .or. &
588 fstrparam%fg_couple_type==3 .or. &
594 & fstrPARAM, fstrDYNAMIC, fstrCPL, restart_step_num, i)
596 type(hecmwst_local_mesh) :: hecMESH
597 type(hecmwst_matrix) :: hecMAT
602 integer(kint) :: kkk0, kkk1, j, kk, i, restart_step_num
605 if( fstrparam%fg_couple == 1)
then
606 if( fstrparam%fg_couple_first /= 0 )
then
607 bsize = dfloat( i ) / dfloat( fstrparam%fg_couple_first )
608 if( bsize > 1.0 ) bsize = 1.0
609 do kkk0 = 1, fstrcpl%coupled_node_n
611 fstrcpl%trac(kkk1-2) = bsize * fstrcpl%trac(kkk1-2)
612 fstrcpl%trac(kkk1-1) = bsize * fstrcpl%trac(kkk1-1)
613 fstrcpl%trac(kkk1 ) = bsize * fstrcpl%trac(kkk1 )
616 if( fstrparam%fg_couple_window > 0 )
then
617 j = i - restart_step_num + 1
618 kk = fstrdynamic%n_step - restart_step_num + 1
619 bsize = 0.5*(1.0-cos(2.0*
pi*dfloat(j)/dfloat(kk)))
620 do kkk0 = 1, fstrcpl%coupled_node_n
622 fstrcpl%trac(kkk1-2) = bsize * fstrcpl%trac(kkk1-2)
623 fstrcpl%trac(kkk1-1) = bsize * fstrcpl%trac(kkk1-1)
624 fstrcpl%trac(kkk1 ) = bsize * fstrcpl%trac(kkk1 )
632 & fstrPARAM, fstrDYNAMIC, fstrCPL, a1, a2, a3, b1, b2, b3, i, is_cycle)
634 type(hecmwst_local_mesh) :: hecMESH
635 type(hecmwst_matrix) :: hecMAT
640 integer(kint) :: kkk0, kkk1, j, i, revocap_flag
641 real(kreal) :: a1, a2, a3, b1, b2, b3
646 if( fstrparam%fg_couple == 1 )
then
647 if( fstrparam%fg_couple_type>1 )
then
648 do j=1, fstrcpl%coupled_node_n
649 if( fstrcpl%dof == 3 )
then
651 kkk1 = fstrcpl%coupled_node(j)*3
653 fstrcpl%disp (kkk0-2) = fstrsolid%unode(kkk1-2) + fstrsolid%dunode(kkk1-2)
654 fstrcpl%disp (kkk0-1) = fstrsolid%unode(kkk1-1) + fstrsolid%dunode(kkk1-1)
655 fstrcpl%disp (kkk0 ) = fstrsolid%unode(kkk1 ) + fstrsolid%dunode(kkk1 )
657 fstrcpl%velo (kkk0-2) = -b1*fstrdynamic%ACC(kkk1-2,1) - b2*fstrdynamic%VEL(kkk1-2,1) + &
658 b3*fstrsolid%dunode(kkk1-2)
659 fstrcpl%velo (kkk0-1) = -b1*fstrdynamic%ACC(kkk1-1,1) - b2*fstrdynamic%VEL(kkk1-1,1) + &
660 b3*fstrsolid%dunode(kkk1-1)
661 fstrcpl%velo (kkk0 ) = -b1*fstrdynamic%ACC(kkk1,1) - b2*fstrdynamic%VEL(kkk1,1) + &
662 b3*fstrsolid%dunode(kkk1)
663 fstrcpl%accel(kkk0-2) = -a1*fstrdynamic%ACC(kkk1-2,1) - a2*fstrdynamic%VEL(kkk1-2,1) + &
664 a3*fstrsolid%dunode(kkk1-2)
665 fstrcpl%accel(kkk0-1) = -a1*fstrdynamic%ACC(kkk1-1,1) - a2*fstrdynamic%VEL(kkk1-1,1) + &
666 a3*fstrsolid%dunode(kkk1-1)
667 fstrcpl%accel(kkk0 ) = -a1*fstrdynamic%ACC(kkk1,1) - a2*fstrdynamic%VEL(kkk1,1) + &
668 a3*fstrsolid%dunode(kkk1)
671 kkk1 = fstrcpl%coupled_node(j)*2
673 fstrcpl%disp (kkk0-1) = fstrsolid%unode(kkk1-1) + fstrsolid%dunode(kkk1-1)
674 fstrcpl%disp (kkk0 ) = fstrsolid%unode(kkk1 ) + fstrsolid%dunode(kkk1 )
676 fstrcpl%velo (kkk0-1) = -b1*fstrdynamic%ACC(kkk1-1,1) - b2*fstrdynamic%VEL(kkk1-1,1) + &
677 b3*fstrsolid%dunode(kkk1-1)
678 fstrcpl%velo (kkk0 ) = -b1*fstrdynamic%ACC(kkk1,1) - b2*fstrdynamic%VEL(kkk1,1) + &
679 b3*fstrsolid%dunode(kkk1)
680 fstrcpl%accel(kkk0-1) = -a1*fstrdynamic%ACC(kkk1-1,1) - a2*fstrdynamic%VEL(kkk1-1,1) + &
681 a3*fstrsolid%dunode(kkk1-1)
682 fstrcpl%accel(kkk0 ) = -a1*fstrdynamic%ACC(kkk1,1) - a2*fstrdynamic%VEL(kkk1,1) + &
683 a3*fstrsolid%dunode(kkk1)
689 select case ( fstrparam%fg_couple_type )
694 if( revocap_flag==0 ) is_cycle = .true.
697 if( revocap_flag==0 )
then
This module contains subroutines for nonlinear implicit dynamic analysis.
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, fstrDYNAMIC, fstrPARAM, fstrCPL, hecLagMAT, infoCTChange, conMAT, restart_step_num, hecMAT0, istep, t_curr, t_delta)
subroutine fstr_solve_nlgeom_dynamic_implicit_contactslag(hecMESH, hecMAT, fstrSOLID, fstrEIG, fstrDYNAMIC, 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 or HHT met...
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, fstrDYNAMIC, fstrEIG, fstrSOLID)
This module assembles the tangent stiffness matrix and, in the implicit dynamic case,...
real(kind=kreal) function, public fstr_calc_kinetic_energy(hecMESH, fstrSOLID, fstrDYNAMIC, velocity)
Recompute each element mass matrix and evaluate 0.5*v^T*M*v. Only rows owned by this rank are accumul...
subroutine, public fstr_creatematrix_and_dampingforce(hecMESH, hecMAT, fstrSOLID, time, tincr, fstrDYNAMIC, coef)
Assemble the system matrix and, optionally, the dynamic damping force.
subroutine, public fstr_calc_mass_product(hecMESH, fstrSOLID, fstrDYNAMIC, vec, mass_vec)
Recompute each element mass matrix and evaluate M*vec. Only rows owned by this rank are computed; the...
subroutine, public fstr_report_lumped_mass_fallback(hecMESH, fstrDYNAMIC)
Report the element types that use the lumped mass although the consistent mass is selected....
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.
logical function fstr_cutback_active()
subroutine fstr_cutback_init(hecMESH, fstrSOLID)
Initializer of cutback variables.
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, fstrPARAM, 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)
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, fstrSOLID)
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, fstrSOLID)
This module provides function to calculate to do updates.
subroutine fstr_updatestate(hecMESH, fstrSOLID, tincr)
Update elastiplastic status.
subroutine fstr_updatenewton(hecMESH, hecMAT, fstrSOLID, fstrPARAM, 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 kmassconsistent
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)
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)