29 subroutine fstr_newton( cstep, hecMESH, hecMAT, fstrSOLID, fstrPARAM, &
30 restrt_step_num, sub_step, ctime, dtime )
32 integer,
intent(in) :: cstep
33 type (hecmwST_local_mesh) :: hecMESH
34 type (hecmwST_matrix) :: hecMAT
35 type (fstr_solid) :: fstrSOLID
36 integer,
intent(in) :: sub_step
37 real(kind=kreal),
intent(in) :: ctime
38 real(kind=kreal),
intent(in) :: dtime
39 type (fstr_param) :: fstrPARAM
40 type (hecmwST_matrix_lagrange) :: hecLagMAT
42 type (hecmwST_local_mesh),
pointer :: hecMESHmpc
43 type (hecmwST_matrix),
pointer :: hecMATmpc
44 integer(kind=kint) :: ndof
45 integer(kind=kint) :: i, iter
46 integer(kind=kint) :: stepcnt
47 integer(kind=kint) :: restrt_step_num
48 real(kind=kreal) :: tt0, tt, res, qnrm, rres, tincr, xnrm, dunrm, rxnrm
49 real(kind=kreal),
allocatable :: coord(:), p(:)
50 logical :: isLinear = .false.
51 integer(kind=kint) :: iterStatus
53 call hecmw_mpc_mat_init(hecmesh, hecmat, hecmeshmpc, hecmatmpc)
55 if(.not.
fstrpr%nlgeom)
then
59 call fstr_init_newton(hecmesh, hecmat, fstrsolid, ctime, tincr, iter, cstep, dtime, fstrparam, heclagmat, ndof)
61 allocate(p(hecmesh%n_node*ndof))
62 allocate(coord(hecmesh%n_node*ndof))
67 do iter=1,fstrsolid%step_ctrl(cstep)%max_iter
74 call fstr_addbc(cstep, hecmesh, hecmat, fstrsolid, fstrparam, heclagmat, stepcnt)
75 call hecmw_mpc_mat_ass(hecmesh, hecmat, hecmeshmpc, hecmatmpc)
76 call hecmw_mpc_trans_rhs(hecmesh, hecmat, hecmatmpc)
79 if( sub_step == restrt_step_num .and. iter == 1 ) hecmatmpc%Iarray(98) = 1
81 hecmatmpc%Iarray(97) = 2
83 hecmatmpc%Iarray(97) = 1
87 call solve_lineq(hecmeshmpc,hecmatmpc)
89 call hecmw_mpc_tback_sol(hecmesh, hecmat, hecmatmpc)
94 do i = 1, hecmesh%n_node*ndof
95 fstrsolid%dunode(i) = fstrsolid%dunode(i) + hecmat%X(i)
109 fstrsolid%NRstat_i(knstmaxit) = max(fstrsolid%NRstat_i(knstmaxit),iter)
110 fstrsolid%NRstat_i(knstsumit) = fstrsolid%NRstat_i(knstsumit) + iter
114 do i=1,hecmesh%n_node*ndof
115 fstrsolid%unode(i) = fstrsolid%unode(i) + fstrsolid%dunode(i)
120 fstrsolid%CutBack_stat = 0
123 call hecmw_mpc_mat_finalize(hecmesh, hecmat, hecmeshmpc, hecmatmpc)
130 restart_step_num, restart_substep_num, sub_step, ctime, dtime, infoCTChange, conMAT )
135 integer,
intent(in) :: cstep
136 type (hecmwST_local_mesh) :: hecMESH
137 type (hecmwST_matrix) :: hecMAT
138 type (fstr_solid) :: fstrSOLID
139 integer,
intent(in) :: sub_step
140 real(kind=kreal),
intent(in) :: ctime
141 real(kind=kreal),
intent(in) :: dtime
142 type (fstr_param) :: fstrPARAM
143 type (fstr_info_contactChange) :: infoCTChange
144 type (hecmwST_matrix_lagrange) :: hecLagMAT
145 type (hecmwST_matrix) :: conMAT
147 integer(kind=kint) :: ndof
148 integer(kind=kint) :: ctAlgo
149 integer(kind=kint) :: i, iter
150 integer(kind=kint) :: al_step, n_al_step, stepcnt
151 real(kind=kreal) :: tt0, tt, res, res0, res1, maxv, relres, tincr
152 integer(kind=kint) :: restart_step_num, restart_substep_num
153 logical :: convg, ctchange
154 integer(kind=kint) :: n_node_global
155 integer(kind=kint) :: contact_changed_global
156 real(kind=kreal),
allocatable :: coord(:)
157 integer(kind=kint) :: istat
161 n_node_global = hecmesh%nn_internal
162 call hecmw_allreduce_i1(hecmesh,n_node_global,hecmw_sum)
164 ctalgo = fstrparam%contact_algo
166 call fstr_init_newton(hecmesh, hecmat, fstrsolid, ctime, tincr, iter, cstep, dtime, fstrparam, heclagmat, ndof)
168 if( cstep == 1 .and. sub_step == restart_substep_num )
then
169 call fstr_save_originalmatrixstructure(hecmat)
170 if(hecmesh%my_rank==0)
write(*,*)
"---Scanning initial contact state---"
172 call hecmw_mat_copy_profile( hecmat, conmat )
174 call fstr_mat_con_contact(cstep, ctalgo, hecmat, fstrsolid, heclagmat, infoctchange, conmat,
fstr_is_contact_active())
175 elseif( hecmat%Iarray(99)==4 )
then
176 write(*, *)
' This type of direct solver is not yet available in such case ! '
177 write(*, *)
' Please change the solver type to intel MKL direct solver !'
178 call hecmw_abort(hecmw_comm_get_comm())
186 allocate(coord(hecmesh%n_node*ndof))
188 call hecmw_mat_clear_b(conmat)
193 n_al_step = fstrsolid%step_ctrl(cstep)%max_contiter
196 do al_step = 1, n_al_step
198 if( hecmesh%my_rank == 0)
then
199 if( n_al_step > 1 )
then
200 print *,
"Augmentation step:", al_step
201 write(
imsg, *)
"Augmentation step:", al_step
210 do iter = 1,fstrsolid%step_ctrl(cstep)%max_iter
216 call hecmw_mat_clear( conmat )
220 if( al_step == 1 .and. stepcnt == 1 )
then
221 maxv = hecmw_mat_diag_max( hecmat, hecmesh )
229 call fstr_addbc(cstep, hecmesh, hecmat, fstrsolid, fstrparam, heclagmat, stepcnt, conmat)
238 call hecmw_update_r (hecmesh, hecmat%X, hecmat%NP, hecmesh%n_dof)
243 do i = 1, hecmesh%n_node*ndof
244 fstrsolid%dunode(i) = fstrsolid%dunode(i)+hecmat%X(i)
251 if( fstrsolid%DLOAD_follow /= 0 .or. fstrsolid%CLOAD_ngrp_rot /= 0 ) &
252 call fstr_ass_load(cstep, ctime+dtime, hecmesh, hecmat, fstrsolid, fstrparam)
257 call hecmw_mat_clear_b( conmat )
267 res = sqrt(res)/n_node_global
268 if( iter == 1 ) res0 = res
269 if( res0 == 0.0d0 )
then
272 relres = dabs( res1-res )/res0
275 if( hecmesh%my_rank == 0 )
then
276 write(*,
'(a,i3,a,2e15.7)')
' - Residual(',iter,
') =', res, relres
280 if( res < fstrsolid%step_ctrl(cstep)%converg .or. &
281 relres < fstrsolid%step_ctrl(cstep)%converg_ddisp )
exit
285 if( iter == fstrsolid%step_ctrl(cstep)%max_iter .or. res > fstrsolid%step_ctrl(cstep)%maxres .or. res /= res )
then
286 if( hecmesh%my_rank == 0)
then
287 write( *,
'(a,i5,a,i5)')
' ### Fail to Converge : at total_step=', cstep,
' sub_step=', sub_step
289 fstrsolid%NRstat_i(knstmaxit) = max(fstrsolid%NRstat_i(knstmaxit),iter)
290 fstrsolid%NRstat_i(knstsumit) = fstrsolid%NRstat_i(knstsumit) + iter
291 fstrsolid%NRstat_i(knstciter) = al_step
292 fstrsolid%CutBack_stat = fstrsolid%CutBack_stat + 1
293 if( iter == fstrsolid%step_ctrl(cstep)%max_iter ) fstrsolid%NRstat_i(knstdresn) = 1
294 if( res > fstrsolid%step_ctrl(cstep)%maxres .or. res /= res ) fstrsolid%NRstat_i(knstdresn) = 2
301 fstrsolid%NRstat_i(knstmaxit) = max(fstrsolid%NRstat_i(knstmaxit),iter)
302 fstrsolid%NRstat_i(knstsumit) = fstrsolid%NRstat_i(knstsumit) + iter
306 call fstr_scan_contact_state( cstep, sub_step, al_step, dtime, ctalgo, hecmesh, fstrsolid, infoctchange, hecmat%B )
308 contact_changed_global = 0
310 call fstr_mat_con_contact( cstep, ctalgo, hecmat, fstrsolid, heclagmat, infoctchange, conmat,
fstr_is_contact_active())
311 contact_changed_global = 1
313 call hecmw_allreduce_i1(hecmesh, contact_changed_global, hecmw_max)
314 if (contact_changed_global > 0)
then
315 call hecmw_mat_clear_b( hecmat )
316 call hecmw_mat_clear_b( conmat )
323 if( al_step >= fstrsolid%step_ctrl(cstep)%max_contiter )
then
324 if( hecmesh%my_rank == 0)
then
325 write( *,
'(a,i5,a,i5)')
' ### Contact failed to Converge : at total_step=', cstep,
' sub_step=', sub_step
327 fstrsolid%NRstat_i(knstciter) = al_step
328 fstrsolid%CutBack_stat = fstrsolid%CutBack_stat + 1
329 fstrsolid%NRstat_i(knstdresn) = 3
337 call hecmw_mat_clear_b( conmat )
346 do i=1,hecmesh%n_node*ndof
347 fstrsolid%unode(i) = fstrsolid%unode(i)+fstrsolid%dunode(i)
350 fstrsolid%NRstat_i(knstciter) = al_step-1
355 fstrsolid%CutBack_stat = 0
362 restart_step_num, restart_substep_num, sub_step, ctime, dtime, infoCTChange, conMAT )
368 integer,
intent(in) :: cstep
369 type (hecmwST_local_mesh) :: hecMESH
370 type (hecmwST_matrix) :: hecMAT
371 type (fstr_solid) :: fstrSOLID
372 integer,
intent(in) :: sub_step
373 real(kind=kreal),
intent(in) :: ctime
374 real(kind=kreal),
intent(in) :: dtime
375 type (fstr_param) :: fstrPARAM
376 type (fstr_info_contactChange) :: infoCTChange
377 type (hecmwST_matrix_lagrange) :: hecLagMAT
378 type (hecmwST_matrix) :: conMAT
380 integer(kind=kint) :: ndof
381 integer(kind=kint) :: ctAlgo
382 integer(kind=kint) :: i, iter, max_iter_contact
383 integer(kind=kint) :: stepcnt, count_step
384 real(kind=kreal) :: tt0, tt, res, res0, res1, relres, tincr, resx
385 integer(kind=kint) :: restart_step_num, restart_substep_num
386 logical :: is_mat_symmetric
387 integer(kind=kint) :: n_node_global
388 integer(kind=kint) :: contact_changed_global
389 integer(kint) :: nndof
390 real(kreal) :: q_residual,x_residual
391 real(kind=kreal),
allocatable :: coord(:)
392 integer(kind=kint) :: istat
394 ctalgo = fstrparam%contact_algo
397 n_node_global = hecmesh%nn_internal
398 call hecmw_allreduce_i1(hecmesh,n_node_global,hecmw_sum)
400 if( hecmat%Iarray(99) == 4 .and. .not. fstr_is_matrixstruct_symmetric(fstrsolid, hecmesh) )
then
401 write(*, *)
' This type of direct solver is not yet available in such case ! '
402 write(*, *)
' Please use intel MKL direct solver !'
403 call hecmw_abort( hecmw_comm_get_comm() )
406 do i=1,fstrsolid%n_contacts
407 fstrsolid%contacts(i)%ctime = ctime + dtime
410 if( cstep==1 .and. sub_step==restart_substep_num )
then
411 call fstr_save_originalmatrixstructure(hecmat)
413 call hecmw_mat_copy_profile( hecmat, conmat )
415 call fstr_mat_con_contact(cstep, ctalgo, hecmat, fstrsolid, heclagmat, infoctchange, conmat,
fstr_is_contact_active())
416 elseif( hecmat%Iarray(99)==4 )
then
417 write(*, *)
' This type of direct solver is not yet available in such case ! '
418 write(*, *)
' Please change the solver type to intel MKL direct solver !'
419 call hecmw_abort(hecmw_comm_get_comm())
421 is_mat_symmetric = fstr_is_matrixstruct_symmetric(fstrsolid, hecmesh)
425 call fstr_init_newton(hecmesh, hecmat, fstrsolid, ctime, tincr, iter, cstep, dtime, fstrparam, heclagmat, ndof)
427 call hecmw_mat_clear_b(conmat)
435 allocate(coord(hecmesh%n_node*ndof))
437 loopforcontactanalysis:
do while( .true. )
438 count_step = count_step+1
445 do iter = 1, fstrsolid%step_ctrl(cstep)%max_iter
446 call hecmw_barrier(hecmesh)
447 if(
myrank == 0 ) print *,
'-------------------------------------------------'
448 call hecmw_barrier(hecmesh)
454 call hecmw_mat_clear( conmat )
462 call fstr_addbc(cstep, hecmesh, hecmat, fstrsolid, fstrparam, heclagmat, stepcnt, conmat)
464 nndof = hecmat%N*hecmat%ndof
474 if( istat /= 0 )
then
475 if( hecmesh%my_rank == 0)
then
476 write( *,
'(a,i5,a,i5)')
' ### Fail to Converge : at total_step=', cstep,
' sub_step=', sub_step
478 fstrsolid%NRstat_i(knstdresn) = 4
479 fstrsolid%CutBack_stat = fstrsolid%CutBack_stat + 1
485 call hecmw_innerproduct_r(hecmesh,ndof,hecmat%X,hecmat%X,resx)
486 resx = sqrt(resx)/n_node_global
488 if( hecmesh%my_rank==0 )
then
489 write(*,
'(a,i3,a,e15.7)')
' - ResidualX (',iter,
') =',resx
490 write(*,
'(a,i3,a,e15.7)')
' - ResidualX+LAG(',iter,
') =',sqrt(x_residual)/n_node_global
491 write(*,
'(a,i3,a,e15.7)')
' - ResidualQ (',iter,
') =',sqrt(q_residual)/n_node_global
495 do i = 1, hecmesh%n_node*ndof
496 fstrsolid%dunode(i) = fstrsolid%dunode(i) + hecmat%X(i)
501 do i = 1, heclagmat%num_lagrange
502 heclagmat%lagrange(i) = heclagmat%lagrange(i)+hecmat%X(hecmesh%n_node*ndof+i)
509 if( fstrsolid%elemact%ELEMACT_egrp_tot > 0 )
then
514 if( fstrsolid%DLOAD_follow /= 0 .or. fstrsolid%CLOAD_ngrp_rot /= 0 ) &
515 call fstr_ass_load(cstep, ctime+dtime, hecmesh, hecmat, fstrsolid, fstrparam)
520 call hecmw_mat_clear_b( conmat )
526 res = sqrt(res)/n_node_global
527 if( iter == 1 ) res0 = res
528 if( res0 == 0.0d0 )
then
531 relres = dabs( res1-res )/res0
533 if( hecmesh%my_rank == 0 )
then
534 write(*,
'(a,i3,a,2e15.7)')
' - Residual(',iter,
') =',res,relres
538 if( res < fstrsolid%step_ctrl(cstep)%converg .or. &
539 relres < fstrsolid%step_ctrl(cstep)%converg_ddisp )
exit
543 if( iter == fstrsolid%step_ctrl(cstep)%max_iter .or. res > fstrsolid%step_ctrl(cstep)%maxres .or. res /= res )
then
544 if( hecmesh%my_rank == 0)
then
545 write( *,
'(a,i5,a,i5)')
' ### Fail to Converge : at total_step=', cstep,
' sub_step=', sub_step
547 fstrsolid%NRstat_i(knstmaxit) = max(fstrsolid%NRstat_i(knstmaxit),iter)
548 fstrsolid%NRstat_i(knstsumit) = fstrsolid%NRstat_i(knstsumit) + iter
549 fstrsolid%NRstat_i(knstciter) = count_step
550 fstrsolid%CutBack_stat = fstrsolid%CutBack_stat + 1
551 if( iter == fstrsolid%step_ctrl(cstep)%max_iter ) fstrsolid%NRstat_i(knstdresn) = 1
552 if( res > fstrsolid%step_ctrl(cstep)%maxres .or. res /= res ) fstrsolid%NRstat_i(knstdresn) = 2
559 fstrsolid%NRstat_i(knstmaxit) = max(fstrsolid%NRstat_i(knstmaxit),iter)
560 fstrsolid%NRstat_i(knstsumit) = fstrsolid%NRstat_i(knstsumit) + iter
562 call fstr_scan_contact_state( cstep, sub_step, count_step, dtime, ctalgo, hecmesh, fstrsolid, infoctchange, hecmat%B )
565 write(*, *)
' This type of direct solver is not yet available in such case ! '
566 write(*, *)
' Please use intel MKL direct solver !'
567 call hecmw_abort( hecmw_comm_get_comm() )
570 is_mat_symmetric = fstr_is_matrixstruct_symmetric(fstrsolid, hecmesh)
571 contact_changed_global = 0
573 call fstr_mat_con_contact( cstep, ctalgo, hecmat, fstrsolid, heclagmat, infoctchange, conmat,
fstr_is_contact_active())
574 contact_changed_global = 1
579 call hecmw_allreduce_i1(hecmesh, contact_changed_global, hecmw_max)
580 if (contact_changed_global > 0)
then
581 call hecmw_mat_clear_b( hecmat )
582 call hecmw_mat_clear_b( conmat )
587 if( count_step >= fstrsolid%step_ctrl(cstep)%max_contiter )
then
588 if( hecmesh%my_rank == 0)
then
589 write( *,
'(a,i5,a,i5)')
' ### Contact failed to Converge : at total_step=', cstep,
' sub_step=', sub_step
591 fstrsolid%NRstat_i(knstciter) = count_step
592 fstrsolid%CutBack_stat = fstrsolid%CutBack_stat + 1
593 fstrsolid%NRstat_i(knstdresn) = 3
601 call hecmw_mat_clear_b( conmat )
605 enddo loopforcontactanalysis
607 fstrsolid%NRstat_i(knstciter) = count_step
611 do i = 1, hecmesh%n_node*ndof
612 fstrsolid%unode(i) = fstrsolid%unode(i)+fstrsolid%dunode(i)
623 fstrsolid%CutBack_stat = 0
626 subroutine fstr_init_newton(hecMESH, hecMAT, fstrSOLID, ctime, tincr, iter, cstep, dtime, fstrPARAM, hecLagMAT, ndof)
629 type (hecmwST_local_mesh) :: hecMESH
630 type (hecmwST_matrix) :: hecMAT
631 type (fstr_solid) :: fstrSOLID
632 real(kind=kreal),
intent(in) :: ctime
633 real(kind=kreal),
intent(in) :: dtime
634 type (fstr_param) :: fstrPARAM
635 real(kind=kreal),
intent(inout) :: tincr
636 integer(kind=kint) :: iter
637 integer,
intent(in) :: cstep
638 type (hecmwST_matrix_lagrange) :: hecLagMAT
639 integer(kind=kint),
intent(inout) :: ndof
641 hecmat%NDOF = hecmesh%n_dof
645 if( fstrsolid%step_ctrl(cstep)%solution == stepstatic ) tincr = 0.d0
647 fstrsolid%dunode(:) = 0.0d0
648 fstrsolid%NRstat_i(:) = 0
650 call fstr_ass_load(cstep, ctime+dtime, hecmesh, hecmat, fstrsolid, fstrparam)
651 if( fstrsolid%elemact%ELEMACT_egrp_tot > 0 )
then
661 integer(kind=kint) :: iterstatus
663 type (hecmwst_local_mesh) :: hecmesh
664 type (hecmwst_matrix) :: hecmat
666 integer(kind=kint),
intent(in) :: ndof
667 integer(kind=kint),
intent(in) :: iter
668 integer(kind=kint),
intent(in) :: sub_step, cstep
670 real(kind=kreal) :: res, qnrm, rres, xnrm, dunrm, rxnrm
674 call hecmw_innerproduct_r(hecmesh, ndof, hecmat%B, hecmat%B, res)
676 call hecmw_innerproduct_r(hecmesh, ndof, hecmat%X, hecmat%X, xnrm)
678 call hecmw_innerproduct_r(hecmesh, ndof, fstrsolid%QFORCE, fstrsolid%QFORCE, qnrm)
680 if (qnrm < 1.0d-8) qnrm = 1.0d0
684 call hecmw_innerproduct_r(hecmesh, ndof, fstrsolid%dunode, fstrsolid%dunode, dunrm)
690 if( hecmesh%my_rank == 0 )
then
691 if (qnrm == 1.0d0)
then
692 write(*,
"(a,i8,a,1pe11.4,a,1pe11.4)")
" iter:", iter,
", residual(abs):", rres,
", disp.corr.:", rxnrm
694 write(*,
"(a,i8,a,1pe11.4,a,1pe11.4)")
" iter:", iter,
", residual:", rres,
", disp.corr.:", rxnrm
697 if( hecmw_mat_get_flag_diverged(hecmat) ==
kno )
then
698 if( rres < fstrsolid%step_ctrl(cstep)%converg .or. &
699 rxnrm < fstrsolid%step_ctrl(cstep)%converg_ddisp )
then
706 if ( iter == fstrsolid%step_ctrl(cstep)%max_iter .or. rres > fstrsolid%step_ctrl(cstep)%maxres) &
710 if( hecmesh%my_rank == 0)
then
711 write(
ilog,
'(a,i5,a,i5)')
'### Fail to Converge : at total_step=', cstep,
' sub_step=', sub_step
712 write( *,
'(a,i5,a,i5)')
' ### Fail to Converge : at total_step=', cstep,
' sub_step=', sub_step
714 fstrsolid%NRstat_i(knstmaxit) = max(fstrsolid%NRstat_i(knstmaxit),iter)
715 fstrsolid%NRstat_i(knstsumit) = fstrsolid%NRstat_i(knstsumit) + iter
716 fstrsolid%CutBack_stat = fstrsolid%CutBack_stat + 1
717 if( iter == fstrsolid%step_ctrl(cstep)%max_iter ) fstrsolid%NRstat_i(knstdresn) = 1
718 if( rres > fstrsolid%step_ctrl(cstep)%maxres .or. rres /= rres ) fstrsolid%NRstat_i(knstdresn) = 2
This module provides a function to deal with prescribed displacement.
subroutine fstr_addbc(cstep, hecMESH, hecMAT, fstrSOLID, fstrPARAM, hecLagMAT, iter, conMAT, RHSvector)
Add Essential Boundary Conditions.
This module provides functions to take into account external load.
subroutine fstr_ass_load(cstep, ctime, hecMESH, hecMAT, fstrSOLID, fstrPARAM)
This subroutine assmble following external force into fstrSOLIDGL and hecMATB afterwards.
This module provide a function to elemact elements.
subroutine fstr_update_elemact_solid_by_value(hecMESH, fstrSOLID, cstep, ctime)
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.
integer(kind=kint) function fstr_check_iteration_converged(hecMESH, hecMAT, fstrSOLID, ndof, iter, sub_step, cstep)
\breaf This function check iteration status
subroutine fstr_init_newton(hecMESH, hecMAT, fstrSOLID, ctime, tincr, iter, cstep, dtime, fstrPARAM, hecLagMAT, ndof)
This module provides function to calculate residual of nodal force.
subroutine, public fstr_update_ndforce_spc(cstep, hecMESH, fstrSOLID, B)
subroutine, public fstr_update_ndforce(cstep, hecMESH, hecMAT, fstrSOLID, conMAT)
real(kind=kreal) function, public fstr_get_norm_para_contact(hecMAT, hecLagMAT, conMAT, hecMESH)
subroutine fstr_calc_residual_vector(hecMESH, hecMAT, fstrSOLID, ctime, tincr, iter, cstep, dtime, fstrPARAM)
\breaf This subroutine calculate residual vector
real(kind=kreal) function, public fstr_get_x_norm_contact(hecMAT, hecLagMAT, hecMESH)
This module provides functions to read in and write out restart files.
This module provides functions to deal with spring force.
subroutine fstr_addspring(cstep, hecMESH, hecMAT, fstrSOLID, fstrPARAM)
This module provides function to calculate tangent stiffness matrix.
subroutine, public fstr_stiffmatrix(hecMESH, hecMAT, fstrSOLID, time, tincr)
This subroutine creates tangential stiffness matrix.
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.
integer(kind=kint) myrank
PARALLEL EXECUTION.
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 ilog
FILE HANDLER.
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 kno
integer(kind=kint), parameter kitrdiverged
logical paracontactflag
PARALLEL CONTACT FLAG.
This modules just summarizes all modules used in static analysis.
This module provides functions to output result.