32 real(kind=kreal),
parameter ::
pi = 3.14159265358979323846d0
39 ,fstrDYNAMIC,fstrRESULT,fstrPARAM &
40 ,fstrCPL,hecLagMAT,restart_step_num,restart_substep_num,infoCTChange &
41 ,conMAT,restart_step_count )
44 type(hecmwst_local_mesh) :: hecmesh
45 type(hecmwst_matrix) :: hecMAT
46 type(hecmwst_matrix),
pointer :: hecMAT0
49 type(hecmwst_result_data) :: fstrRESULT
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) :: i, tot_step_print, CBbound
60 real(kind=kreal) :: time_1, time_2, factor
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 integer(kind=kint) :: max_iter_contact
66 real(kind=kreal) :: converg_dlag
67 type(fstr_info_contactchange) :: infoctchange_bak
69 logical :: is_outpoint
70 integer(kind=kint) :: n_node_global
71 logical :: is_mat_symmetric, is_interaction_active
75 is_interaction_active = (
associated( fstrsolid%contacts ) .or.
associated( fstrsolid%embeds ) )
80 n_node_global = hecmesh%nn_internal
81 call hecmw_allreduce_i1(hecmesh,n_node_global,hecmw_sum)
83 ctalgo = fstrparam%contact_algo
86 write(*,*)
' This type of direct solver is not yet available in such case ! '
87 write(*,*)
' Please use intel MKL direct solver !'
88 call hecmw_abort(hecmw_comm_get_comm())
91 hecmat%NDOF=hecmesh%n_dof
97 if(
associated( fstrsolid%contacts ) )
then
98 call initialize_contact_output_vectors(fstrsolid,hecmat)
99 call setup_contact_elesurf_for_area( 1, hecmesh, fstrsolid )
103 time_1 = hecmw_wtime()
106 if(dabs(fstrdynamic%beta) < 1.0e-20)
then
107 if( hecmesh%my_rank == 0 )
then
108 write(
imsg,*)
'stop due to Newmark-beta = 0'
110 call hecmw_abort( hecmw_comm_get_comm())
114 if(fstrdynamic%idx_mas == 1)
then
115 call setmass(fstrsolid,hecmesh,hecmat,fstreig)
118 else if(fstrdynamic%idx_mas == 2)
then
119 if( hecmesh%my_rank .eq. 0 )
then
120 write(
imsg,*)
'stop: consistent mass matrix is not yet available !'
122 call hecmw_abort( hecmw_comm_get_comm())
125 hecmat%Iarray(98) = 1
126 hecmat%Iarray(97) = 1
129 if( restart_step_num == 1 .and. fstrdynamic%VarInitialize .and. abs(fstrdynamic%ray_m) > 1.0d-15 ) &
133 if( restart_step_num == 1 )
then
138 fstrdynamic%VEC3(:) =0.d0
143 ctalgo, hecmesh, fstrsolid, infoctchange)
145 call hecmw_mat_copy_profile( hecmat, conmat )
150 elseif( hecmat%Iarray(99)==4 )
then
151 write(*,*)
' This type of direct solver is not yet available in such case ! '
152 write(*,*)
' Please change solver type to intel MKL direct solver !'
153 call hecmw_abort(hecmw_comm_get_comm())
158 fstrsolid%FACTOR = 0.0d0
162 step_count = restart_step_count
163 do tot_step=1, fstrsolid%nstep_tot
164 tot_step_print = tot_step+restart_step_num-1
165 if(hecmesh%my_rank==0)
write(*,*)
''
166 if(hecmesh%my_rank==0)
write(*,
'(a,i5)')
' loading step=',tot_step_print
168 sub_step = restart_substep_num
170 if (ndof == 4 .and. hecmesh%my_rank==0)
write(*,
'(a,i5)')
"iter: ",sub_step
173 & fstrsolid%NRstat_i, fstrsolid%NRstat_r, fstrsolid%AutoINC_stat, fstrsolid%CutBack_stat )
179 fstrdynamic, fstrparam, fstrcpl, heclagmat, infoctchange, conmat, &
180 restart_step_num, hecmat0, sub_step, fstrdynamic%t_curr, fstrdynamic%t_delta)
184 & tot_step_print, sub_step, fstrsolid%NRstat_i, fstrsolid%NRstat_r, &
185 & fstrsolid%AutoINC_stat, fstrsolid%CutBack_stat )
188 if( fstrsolid%CutBack_stat == 0 )
then
194 cbbound = fstrparam%ainc(fstrsolid%step_ctrl(tot_step)%AincParam_id)%CBbound
195 if( fstrsolid%CutBack_stat == cbbound )
then
196 if( hecmesh%my_rank == 0 )
then
197 write(*,*)
'Number of successive cutback reached max number: ',cbbound
200 call hecmw_abort( hecmw_comm_get_comm() )
206 if( is_interaction_active .and. fstrparam%contact_algo ==
kcaslagrange )
then
212 if( hecmesh%my_rank == 0 )
write(*,*)
'### State has been restored at time =',
fstr_get_time()
215 if( sub_step == fstrsolid%step_ctrl(tot_step)%num_substep )
then
216 if( hecmesh%my_rank == 0 )
then
217 write(*,
'(a,i5,a,f6.3)')
'### Number of substeps reached max number: at total_step=', &
220 call hecmw_abort( hecmw_comm_get_comm())
224 time_2 = hecmw_wtime()
225 if( hecmesh%my_rank==0)
write(
imsg,
'(a,",",2(I8,","),f10.2)') &
226 &
'step, substep, solve (sec) :', tot_step_print, sub_step, time_2 - time_1
230 if( fstrsolid%CutBack_stat > 0 ) stop
235 step_count = step_count + 1
241 call fstr_dynamic_output(tot_step, step_count, fstrdynamic%t_curr, hecmesh, fstrsolid, fstrdynamic, fstrparam, is_outpoint)
244 call dynamic_output_monit(tot_step, i, fstrdynamic%t_curr, hecmesh, fstrparam, fstrdynamic, fstreig, fstrsolid)
247 if( fstrdynamic%restart_nout > 0 )
then
248 if( mod(step_count,fstrdynamic%restart_nout).eq.0 )
then
250 .false.,infoctchange%contactNode_current,step_count)
257 if( sub_step == fstrsolid%step_ctrl(tot_step)%num_substep )
then
258 if( hecmesh%my_rank == 0 )
then
259 write(*,
'(a,i5,a,f6.3)')
'### Number of substeps reached max number: at total_step=', &
266 sub_step = sub_step + 1
270 if( fstrdynamic%restart_nout > 0 )
then
272 .true.,infoctchange%contactNode_current,step_count)
275 restart_substep_num = 1
279 if (
associated(hecmat0))
then
280 call hecmw_mat_finalize(hecmat0)
285 if( hecmesh%my_rank == 0 )
then
287 write(
imsg,
'("### FSTR_SOLVE_NLGEOM FINISHED!")')
288 write(*,
'("### FSTR_SOLVE_NLGEOM FINISHED!")')
294 fstrDYNAMIC, fstrPARAM, fstrCPL, hecLagMAT, infoCTChange, conMAT, &
295 restart_step_num, hecMAT0, istep, t_curr, t_delta)
298 integer(kind=kint),
intent(in) :: cstep, restart_step_num, istep
299 real(kind=kreal),
intent(in) :: t_curr, t_delta
300 type(hecmwst_local_mesh) :: hecmesh
301 type(hecmwst_matrix) :: hecMAT
302 type(hecmwst_matrix),
pointer :: hecMAT0
308 type(hecmwst_matrix_lagrange) :: hecLagMAT
309 type(fstr_info_contactchange) :: infoCTChange
310 type(hecmwst_matrix) :: conMAT
313 integer(kind=kint) :: j, kk, idm, imm
314 integer(kind=kint) :: iter
315 real(kind=kreal) :: a1, a2, a3, b1, b2, b3, c1, c2
316 real(kind=kreal) :: coef(6)
317 real(kind=kreal) :: res, res1, res0, relres
318 integer(kind=kint) :: count_step, stepcnt
319 real(kind=kreal) :: maxdlag
320 integer(kind=kint) :: contact_changed_global
321 logical :: is_mat_symmetric
324 integer(kind=kint) :: ctAlgo, max_iter_contact
325 integer(kind=kint) :: nnod, ndof, nn
326 real(kind=kreal) :: converg_dlag
327 real(kind=kreal),
allocatable :: coord(:)
328 integer(kind=kint) :: iterStatus, nresid, n_node_global
329 real(kind=kreal),
allocatable :: resid_work(:)
331 fstrsolid%NRstat_i(:) = 0
334 n_node_global = hecmesh%nn_internal
335 call hecmw_allreduce_i1(hecmesh, n_node_global, hecmw_sum)
336 ctalgo = fstrparam%contact_algo
337 max_iter_contact = fstrsolid%step_ctrl(cstep)%max_contiter
338 converg_dlag = fstrsolid%step_ctrl(cstep)%converg_lag
339 nnod = hecmesh%n_node
342 allocate(coord(hecmesh%n_node*ndof))
343 allocate(resid_work(hecmesh%n_node*ndof + conmat%NP*ndof))
345 a1 = .5d0/fstrdynamic%beta - 1.d0
346 a2 = 1.d0/(fstrdynamic%beta*t_delta)
347 a3 = 1.d0/(fstrdynamic%beta*t_delta*t_delta)
348 b1 = ( .5d0*fstrdynamic%gamma/fstrdynamic%beta - 1.d0 )*t_delta
349 b2 = fstrdynamic%gamma/fstrdynamic%beta - 1.d0
350 b3 = fstrdynamic%gamma/(fstrdynamic%beta*t_delta)
351 c1 = 1.d0 + fstrdynamic%ray_k*b3
352 c2 = a3 + fstrdynamic%ray_m*b3
354 coef(1) = a1; coef(2) = a2; coef(3) = a3
355 coef(4) = b1; coef(5) = b2; coef(6) = b3
357 if(hecmesh%my_rank==0)
then
358 write(*,
'(A)')
'-------------------------------------------------'
359 write(*,
'('' time step='',i10,'' time='',1pe13.4e3)') istep,t_curr
363 fstrdynamic%VEC1(j) = a1*fstrdynamic%ACC(j,1) + a2*fstrdynamic%VEL(j,1)
364 fstrdynamic%VEC2(j) = b1*fstrdynamic%ACC(j,1) + b2*fstrdynamic%VEL(j,1)
372 fstrsolid%dunode(:) =0.d0
376 loopforcontactanalysis:
do while( .true. )
377 count_step = count_step + 1
384 do iter = 1, fstrsolid%step_ctrl(cstep)%max_iter
391 call dynamic_mat_ass_load (cstep, t_curr+t_delta, hecmesh, hecmat, fstrsolid, fstrdynamic, fstrparam, iter )
392 do j=1, hecmesh%n_node* hecmesh%n_dof
393 hecmat%B(j) = hecmat%B(j) - fstrsolid%QFORCE(j) + fstrsolid%DFORCE(j)
400 & fstrparam, fstrdynamic, fstrcpl, restart_step_num, istep)
402 call hecmw_mat_clear( conmat )
403 call hecmw_mat_clear_b( conmat )
413 & fstrparam, heclagmat, t_curr+t_delta, stepcnt, conmat=conmat)
415 & fstrparam, heclagmat, t_curr+t_delta, stepcnt, conmat=conmat)
417 & fstrparam, heclagmat, t_curr+t_delta, stepcnt, conmat=conmat)
424 elseif( abs(maxdlag) < 1.0d-15)
then
427 call hecmw_allreduce_r1(hecmesh, maxdlag, hecmw_max)
430 ndof, iter, istep, cstep, &
431 resid_work, nresid, &
435 maxdlag, converg_dlag)
438 fstrsolid%NRstat_i(knstciter) = count_step
448 if( istat /= 0 )
then
449 if( hecmesh%my_rank == 0)
then
450 write( *,
'(a,i5,a,i5)')
' ### Fail to Converge : at total_step=', cstep,
' sub_step=', istep
452 fstrsolid%NRstat_i(knstdresn) = 4
453 fstrsolid%CutBack_stat = fstrsolid%CutBack_stat + 1
458 call hecmw_update_r (hecmesh, hecmat%X, hecmat%NP, hecmat%NDOF)
461 do j=1,hecmesh%n_node*ndof
462 fstrsolid%dunode(j) = fstrsolid%dunode(j)+hecmat%X(j)
465 & t_delta,iter, fstrdynamic%strainEnergy )
479 do j=1,heclagmat%num_lagrange
480 heclagmat%lagrange(j) = heclagmat%lagrange(j) + hecmat%X(hecmesh%n_node*ndof+j)
481 if(dabs(hecmat%X(hecmesh%n_node*ndof+j))>maxdlag) maxdlag=dabs(hecmat%X(hecmesh%n_node*ndof+j))
485 if(.not. fstrparam%nlgeom)
exit
488 fstrsolid%NRstat_i(knstmaxit) = max(fstrsolid%NRstat_i(knstmaxit),iter)
489 fstrsolid%NRstat_i(knstsumit) = fstrsolid%NRstat_i(knstsumit) + iter
496 hecmesh, fstrsolid, infoctchange)
499 write(*,*)
' This type of direct solver is not yet available in such case ! '
500 write(*,*)
' Please use intel MKL direct solver !'
501 call hecmw_abort(hecmw_comm_get_comm())
505 contact_changed_global=0
507 exit loopforcontactanalysis
510 contact_changed_global=1
512 call hecmw_allreduce_i1(hecmesh,contact_changed_global,hecmw_max)
513 if (contact_changed_global > 0)
then
514 call hecmw_mat_clear_b( hecmat )
515 call hecmw_mat_clear_b( conmat )
519 if( count_step > max_iter_contact )
exit loopforcontactanalysis
522 if( count_step >= fstrsolid%step_ctrl(cstep)%max_contiter )
then
523 if( hecmesh%my_rank == 0)
then
524 write( *,
'(a,i5,a,i5)')
' ### Contact failed to Converge : at total_step=', cstep,
' sub_step=', istep
526 fstrsolid%NRstat_i(knstciter) = count_step
527 fstrsolid%CutBack_stat = fstrsolid%CutBack_stat + 1
528 fstrsolid%NRstat_i(knstdresn) = 3
532 enddo loopforcontactanalysis
534 fstrsolid%NRstat_i(knstciter) = count_step
538 & fstrparam, fstrdynamic, fstrcpl, a1, a2, a3, b1, b2, b3, istep, is_cycle)
544 fstrdynamic%kineticEnergy = 0.0d0
546 fstrdynamic%ACC (j,2) = -a1*fstrdynamic%ACC(j,1) - a2*fstrdynamic%VEL(j,1) + &
547 a3*fstrsolid%dunode(j)
548 fstrdynamic%VEL (j,2) = -b1*fstrdynamic%ACC(j,1) - b2*fstrdynamic%VEL(j,1) + &
549 b3*fstrsolid%dunode(j)
550 fstrdynamic%ACC (j,1) = fstrdynamic%ACC (j,2)
551 fstrdynamic%VEL (j,1) = fstrdynamic%VEL (j,2)
553 fstrsolid%unode(j) = fstrsolid%unode(j)+fstrsolid%dunode(j)
554 fstrdynamic%DISP(j,2) = fstrsolid%unode(j)
556 fstrdynamic%kineticEnergy = fstrdynamic%kineticEnergy + &
557 0.5d0*fstreig%mass(j)*fstrdynamic%VEL(j,2)*fstrdynamic%VEL(j,2)
564 deallocate(resid_work)
565 fstrsolid%CutBack_stat = 0
572 if( fstrparam%fg_couple == 1)
then
573 if( fstrparam%fg_couple_type==1 .or. &
574 fstrparam%fg_couple_type==3 .or. &
580 & fstrPARAM, fstrDYNAMIC, fstrCPL, restart_step_num, i)
582 type(hecmwst_local_mesh) :: hecMESH
583 type(hecmwst_matrix) :: hecMAT
588 integer(kint) :: kkk0, kkk1, j, kk, i, restart_step_num
591 if( fstrparam%fg_couple == 1)
then
592 if( fstrparam%fg_couple_first /= 0 )
then
593 bsize = dfloat( i ) / dfloat( fstrparam%fg_couple_first )
594 if( bsize > 1.0 ) bsize = 1.0
595 do kkk0 = 1, fstrcpl%coupled_node_n
597 fstrcpl%trac(kkk1-2) = bsize * fstrcpl%trac(kkk1-2)
598 fstrcpl%trac(kkk1-1) = bsize * fstrcpl%trac(kkk1-1)
599 fstrcpl%trac(kkk1 ) = bsize * fstrcpl%trac(kkk1 )
602 if( fstrparam%fg_couple_window > 0 )
then
603 j = i - restart_step_num + 1
604 kk = fstrdynamic%n_step - restart_step_num + 1
605 bsize = 0.5*(1.0-cos(2.0*
pi*dfloat(j)/dfloat(kk)))
606 do kkk0 = 1, fstrcpl%coupled_node_n
608 fstrcpl%trac(kkk1-2) = bsize * fstrcpl%trac(kkk1-2)
609 fstrcpl%trac(kkk1-1) = bsize * fstrcpl%trac(kkk1-1)
610 fstrcpl%trac(kkk1 ) = bsize * fstrcpl%trac(kkk1 )
618 & fstrPARAM, fstrDYNAMIC, fstrCPL, a1, a2, a3, b1, b2, b3, i, is_cycle)
620 type(hecmwst_local_mesh) :: hecMESH
621 type(hecmwst_matrix) :: hecMAT
626 integer(kint) :: kkk0, kkk1, j, i, revocap_flag
627 real(kreal) :: a1, a2, a3, b1, b2, b3
632 if( fstrparam%fg_couple == 1 )
then
633 if( fstrparam%fg_couple_type>1 )
then
634 do j=1, fstrcpl%coupled_node_n
635 if( fstrcpl%dof == 3 )
then
637 kkk1 = fstrcpl%coupled_node(j)*3
639 fstrcpl%disp (kkk0-2) = fstrsolid%unode(kkk1-2) + fstrsolid%dunode(kkk1-2)
640 fstrcpl%disp (kkk0-1) = fstrsolid%unode(kkk1-1) + fstrsolid%dunode(kkk1-1)
641 fstrcpl%disp (kkk0 ) = fstrsolid%unode(kkk1 ) + fstrsolid%dunode(kkk1 )
643 fstrcpl%velo (kkk0-2) = -b1*fstrdynamic%ACC(kkk1-2,1) - b2*fstrdynamic%VEL(kkk1-2,1) + &
644 b3*fstrsolid%dunode(kkk1-2)
645 fstrcpl%velo (kkk0-1) = -b1*fstrdynamic%ACC(kkk1-1,1) - b2*fstrdynamic%VEL(kkk1-1,1) + &
646 b3*fstrsolid%dunode(kkk1-1)
647 fstrcpl%velo (kkk0 ) = -b1*fstrdynamic%ACC(kkk1,1) - b2*fstrdynamic%VEL(kkk1,1) + &
648 b3*fstrsolid%dunode(kkk1)
649 fstrcpl%accel(kkk0-2) = -a1*fstrdynamic%ACC(kkk1-2,1) - a2*fstrdynamic%VEL(kkk1-2,1) + &
650 a3*fstrsolid%dunode(kkk1-2)
651 fstrcpl%accel(kkk0-1) = -a1*fstrdynamic%ACC(kkk1-1,1) - a2*fstrdynamic%VEL(kkk1-1,1) + &
652 a3*fstrsolid%dunode(kkk1-1)
653 fstrcpl%accel(kkk0 ) = -a1*fstrdynamic%ACC(kkk1,1) - a2*fstrdynamic%VEL(kkk1,1) + &
654 a3*fstrsolid%dunode(kkk1)
657 kkk1 = fstrcpl%coupled_node(j)*2
659 fstrcpl%disp (kkk0-1) = fstrsolid%unode(kkk1-1) + fstrsolid%dunode(kkk1-1)
660 fstrcpl%disp (kkk0 ) = fstrsolid%unode(kkk1 ) + fstrsolid%dunode(kkk1 )
662 fstrcpl%velo (kkk0-1) = -b1*fstrdynamic%ACC(kkk1-1,1) - b2*fstrdynamic%VEL(kkk1-1,1) + &
663 b3*fstrsolid%dunode(kkk1-1)
664 fstrcpl%velo (kkk0 ) = -b1*fstrdynamic%ACC(kkk1,1) - b2*fstrdynamic%VEL(kkk1,1) + &
665 b3*fstrsolid%dunode(kkk1)
666 fstrcpl%accel(kkk0-1) = -a1*fstrdynamic%ACC(kkk1-1,1) - a2*fstrdynamic%VEL(kkk1-1,1) + &
667 a3*fstrsolid%dunode(kkk1-1)
668 fstrcpl%accel(kkk0 ) = -a1*fstrdynamic%ACC(kkk1,1) - a2*fstrdynamic%VEL(kkk1,1) + &
669 a3*fstrsolid%dunode(kkk1)
675 select case ( fstrparam%fg_couple_type )
680 if( revocap_flag==0 ) is_cycle = .true.
683 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)
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, 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, 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, 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_convergence(hecMESH, hecMAT, fstrSOLID, fstrPR, ndof, iter, sub_step, cstep, residual_vec, nresid, resb, res_prev, n_node_global, iterStatus, maxDLag, converg_dlag)
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_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
integer(kind=kint), parameter kcaslagrange
contact analysis algorithm
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 kitrdiverged
Data for coupling analysis.
Data for DYNAMIC ANSLYSIS (fstrDYNAMIC)
Package of data used by Lanczos eigenvalue solver.
FSTR INNER CONTROL PARAMETERS (fstrPARAM)