33 fstrDYNAMIC,fstrRESULT,fstrPARAM,fstrCPL, restrt_step_num )
36 integer,
intent(in) :: cstep
37 type(hecmwst_local_mesh) :: hecMESH
38 type(hecmwst_matrix) :: hecMAT
41 type(hecmwst_result_data) :: fstrRESULT
44 type(hecmwst_matrix_lagrange) :: hecLagMAT
48 type(hecmwst_local_mesh),
pointer :: hecMESHmpc
49 type(hecmwst_matrix),
pointer :: hecMATmpc
50 type(hecmwst_matrix),
pointer :: hecMAT0
51 integer(kind=kint) :: nnod, ndof, numnp, nn
52 integer(kind=kint) :: i, j, ids, ide, ims, ime, kk, idm, imm
53 integer(kind=kint) :: iter
54 integer(kind=kint) :: iiii5, iexit
55 integer(kind=kint) :: revocap_flag
56 integer(kind=kint) :: kkk0, kkk1
57 integer(kind=kint) :: restrt_step_num
58 integer(kind=kint) :: n_node_global
59 integer(kind=kint) :: ierr
61 real(kind=kreal) :: a1, a2, a3, b1, b2, b3, c1, c2
62 real(kind=kreal) :: bsize, res, resb
63 real(kind=kreal) :: time_1, time_2
64 real(kind=kreal),
parameter :: pi = 3.14159265358979323846d0
65 real(kind=kreal),
allocatable :: coord(:)
72 call hecmw_mpc_mat_init(hecmesh, hecmat, hecmeshmpc, hecmatmpc)
76 n_node_global = hecmesh%nn_internal
77 call hecmw_allreduce_i1(hecmesh,n_node_global,hecmw_sum)
79 hecmat%NDOF=hecmesh%n_dof
84 allocate(coord(hecmesh%n_node*ndof))
87 time_1 = hecmw_wtime()
90 if(dabs(fstrdynamic%beta) < 1.0e-20)
then
91 if( hecmesh%my_rank == 0 )
then
92 write(
imsg,*)
'stop due to Newmark-beta = 0'
94 call hecmw_abort( hecmw_comm_get_comm())
98 if(fstrdynamic%idx_mas == 1)
then
99 call setmass(fstrsolid,hecmesh,hecmat,fstreig)
102 else if(fstrdynamic%idx_mas == 2)
then
103 if( hecmesh%my_rank .eq. 0 )
then
104 write(
imsg,*)
'stop: consistent mass matrix is not yet available !'
106 call hecmw_abort( hecmw_comm_get_comm())
109 hecmat%Iarray(98) = 1
110 hecmat%Iarray(97) = 1
113 a1 = 0.5d0/fstrdynamic%beta - 1.0d0
114 a2 = 1.0d0/(fstrdynamic%beta*fstrdynamic%t_delta)
115 a3 = 1.0d0/(fstrdynamic%beta*fstrdynamic%t_delta*fstrdynamic%t_delta)
116 b1 = (0.5d0*fstrdynamic%gamma/fstrdynamic%beta - 1.0d0 )*fstrdynamic%t_delta
117 b2 = fstrdynamic%gamma/fstrdynamic%beta - 1.0d0
118 b3 = fstrdynamic%gamma/(fstrdynamic%beta*fstrdynamic%t_delta)
119 c1 = 1.0d0 + fstrdynamic%ray_k*b3
120 c2 = a3 + fstrdynamic%ray_m*b3
123 if( restrt_step_num == 1 )
then
128 fstrdynamic%VEC3(:) =0.0d0
132 do i = restrt_step_num, fstrdynamic%n_step
133 if(ndof == 4 .and. hecmesh%my_rank==0)
write(*,
'(a,i5)')
"iter: ",i
135 fstrdynamic%i_step = i
136 fstrdynamic%t_curr = fstrdynamic%t_delta * i
138 if(hecmesh%my_rank==0)
then
140 write(
ista,
'('' time step='',i10,'' time='',1pe13.4e3)') i,fstrdynamic%t_curr
144 fstrdynamic%VEC1(j) = a1*fstrdynamic%ACC(j,1) + a2*fstrdynamic%VEL(j,1)
145 fstrdynamic%VEC2(j) = b1*fstrdynamic%ACC(j,1) + b2*fstrdynamic%VEL(j,1)
151 fstrsolid%dunode(:) =0.d0
155 do iter = 1, fstrsolid%step_ctrl(cstep)%max_iter
156 if (fstrparam%nlgeom)
then
157 call fstr_stiffmatrix( hecmesh, hecmat, fstrsolid, fstrdynamic%t_curr, fstrdynamic%t_delta )
159 if (.not.
associated(hecmat0))
then
160 call fstr_stiffmatrix( hecmesh, hecmat, fstrsolid, fstrdynamic%t_curr, fstrdynamic%t_delta )
162 call hecmw_mat_init(hecmat0)
163 call hecmw_mat_copy_profile(hecmat, hecmat0)
164 call hecmw_mat_copy_val(hecmat, hecmat0)
166 call hecmw_mat_copy_val(hecmat0, hecmat)
170 if( fstrdynamic%ray_k/=0.d0 .or. fstrdynamic%ray_m/=0.d0 )
then
172 hecmat%X(j) = fstrdynamic%VEC2(j) - b3*fstrsolid%dunode(j)
175 if( fstrdynamic%ray_k/=0.d0 )
then
176 if( hecmesh%n_dof == 3 )
then
177 call hecmw_matvec (hecmesh, hecmat, hecmat%X, fstrdynamic%VEC3)
178 else if( hecmesh%n_dof == 2 )
then
179 call hecmw_matvec (hecmesh, hecmat, hecmat%X, fstrdynamic%VEC3)
180 else if( hecmesh%n_dof == 6 )
then
181 call matvec(fstrdynamic%VEC3, hecmat%X, hecmat, ndof, hecmat%D, hecmat%AU, hecmat%AL)
187 do j=1, hecmesh%n_node* hecmesh%n_dof
188 hecmat%B(j) = hecmat%B(j)- fstrsolid%QFORCE(j) + fstreig%mass(j)*( fstrdynamic%VEC1(j)-a3*fstrsolid%dunode(j) &
189 + fstrdynamic%ray_m* hecmat%X(j) ) + fstrdynamic%ray_k*fstrdynamic%VEC3(j)
195 & fstrparam, fstrdynamic, fstrcpl, restrt_step_num, pi, i)
197 do j = 1 ,nn*hecmat%NP
198 hecmat%D(j) = c1* hecmat%D(j)
200 do j = 1 ,nn*hecmat%NPU
201 hecmat%AU(j) = c1* hecmat%AU(j)
203 do j = 1 ,nn*hecmat%NPL
204 hecmat%AL(j) = c1*hecmat%AL(j)
208 idm = nn*(j-1)+1 + (ndof+1)*(kk-1)
209 imm = ndof*(j-1) + kk
210 hecmat%D(idm) = hecmat%D(idm) + c2*fstreig%mass(imm)
215 call dynamic_mat_ass_bc (hecmesh, hecmat, fstrsolid, fstrdynamic, fstrparam, heclagmat, iter)
218 call hecmw_mpc_mat_ass(hecmesh, hecmat, hecmeshmpc, hecmatmpc)
219 call hecmw_mpc_trans_rhs(hecmesh, hecmat, hecmatmpc)
223 call hecmw_innerproduct_r(hecmesh, ndof, hecmatmpc%B, hecmatmpc%B, bsize)
230 res = dsqrt(bsize/resb)
231 if( fstrparam%nlgeom .and. ndof /= 4 )
then
232 if(hecmesh%my_rank==0)
write(*,
'(a,i5,a,1pe12.4)')
"iter: ",iter,
", res: ",res
233 if(hecmesh%my_rank==0)
write(
ista,
'(''iter='',I5,''- Residual'',E15.7)')iter,res
234 if( res<fstrsolid%step_ctrl(cstep)%converg )
exit
239 if( iexit .ne. 1 )
then
240 if( fstrparam%nlgeom )
then
242 hecmatmpc%Iarray(97) = 2
244 hecmatmpc%Iarray(97) = 1
248 call solve_lineq(hecmeshmpc,hecmatmpc)
249 if( fstrparam%nlgeom )
then
253 call hecmw_mpc_tback_sol(hecmesh, hecmat, hecmatmpc)
255 do j=1,hecmesh%n_node*ndof
256 fstrsolid%dunode(j) = fstrsolid%dunode(j)+hecmat%X(j)
260 & fstrdynamic%t_delta, iter, fstrdynamic%strainEnergy )
262 if(.not. fstrparam%nlgeom)
exit
267 if( iter>fstrsolid%step_ctrl(cstep)%max_iter )
then
268 if( hecmesh%my_rank==0)
then
269 write(
ilog,*)
'### Fail to Converge : at step=', i
270 write(
ista,*)
'### Fail to Converge : at step=', i
271 write( *,*)
' ### Fail to Converge : at step=', i
279 & fstrparam, fstrdynamic, fstrcpl, a1, a2, a3, b1, b2, b3, i, is_cycle)
286 fstrdynamic%kineticEnergy = 0.0d0
288 fstrdynamic%ACC (j,2) = -a1*fstrdynamic%ACC(j,1) - a2*fstrdynamic%VEL(j,1) + &
289 a3*fstrsolid%dunode(j)
290 fstrdynamic%VEL (j,2) = -b1*fstrdynamic%ACC(j,1) - b2*fstrdynamic%VEL(j,1) + &
291 b3*fstrsolid%dunode(j)
292 fstrdynamic%ACC (j,1) = fstrdynamic%ACC (j,2)
293 fstrdynamic%VEL (j,1) = fstrdynamic%VEL (j,2)
295 fstrsolid%unode(j) = fstrsolid%unode(j)+fstrsolid%dunode(j)
296 fstrdynamic%DISP(j,2) = fstrsolid%unode(j)
298 fstrdynamic%kineticEnergy = fstrdynamic%kineticEnergy + &
299 0.5d0*fstreig%mass(j)*fstrdynamic%VEL(j,2)*fstrdynamic%VEL(j,2)
310 if( fstrdynamic%restart_nout > 0 )
then
311 if( mod(i,fstrdynamic%restart_nout).eq.0 .or. i.eq.fstrdynamic%n_step)
then
318 time_2 = hecmw_wtime()
320 if( hecmesh%my_rank == 0 )
then
321 write(
ista,
'(a,f10.2,a)')
' solve (sec) :', time_2 - time_1,
's'
325 call hecmw_mpc_mat_finalize(hecmesh, hecmat, hecmeshmpc, hecmatmpc)
326 if (
associated(hecmat0))
then
327 call hecmw_mat_finalize(hecmat0)
335 ,fstrDYNAMIC,fstrRESULT,fstrPARAM &
336 ,fstrCPL,hecLagMAT,restrt_step_num,infoCTChange &
340 integer,
intent(in) :: cstep
341 type(hecmwst_local_mesh) :: hecMESH
342 type(hecmwst_matrix) :: hecMAT
343 type(hecmwst_matrix),
pointer :: hecMAT0
346 type(hecmwst_result_data) :: fstrRESULT
350 type(hecmwst_matrix_lagrange) :: hecLagMAT
351 type(fstr_info_contactchange) :: infoCTChange
352 type(hecmwst_matrix) :: conMAT
355 integer(kind=kint) :: nnod, ndof, numnp, nn
356 integer(kind=kint) :: i, j, ids, ide, ims, ime, kk, idm, imm
357 integer(kind=kint) :: iter
358 real(kind=kreal) :: a1, a2, a3, b1, b2, b3, c1, c2
359 real(kind=kreal) :: bsize, res, res1, rf
360 real(kind=kreal) :: res0, relres
361 real :: time_1, time_2
362 real(kind=kreal),
parameter :: pi = 3.14159265358979323846d0
364 integer(kind=kint) :: restrt_step_num
365 integer(kind=kint) :: ctAlgo
366 integer(kind=kint) :: max_iter_contact, count_step
367 integer(kind=kint) :: stepcnt
368 real(kind=kreal) :: maxdlag, converg_dlag
370 integer(kind=kint) :: n_node_global
371 integer(kind=kint) :: contact_changed_global
372 integer(kind=kint) :: nndof,npdof
373 logical :: is_mat_symmetric
376 real(kind=kreal),
allocatable :: tmp_conb(:)
377 real(kind=kreal),
allocatable :: coord(:)
382 n_node_global = hecmesh%nn_internal
383 call hecmw_allreduce_i1(hecmesh,n_node_global,hecmw_sum)
385 ctalgo = fstrparam%contact_algo
388 write(*,*)
' This type of direct solver is not yet available in such case ! '
389 write(*,*)
' Please use intel MKL direct solver !'
390 call hecmw_abort(hecmw_comm_get_comm())
393 hecmat%NDOF=hecmesh%n_dof
399 allocate(coord(hecmesh%n_node*ndof))
400 if(
associated( fstrsolid%contacts ) )
call initialize_contact_output_vectors(fstrsolid,hecmat)
403 time_1 = hecmw_wtime()
406 if(dabs(fstrdynamic%beta) < 1.0e-20)
then
407 if( hecmesh%my_rank == 0 )
then
408 write(
imsg,*)
'stop due to Newmark-beta = 0'
410 call hecmw_abort( hecmw_comm_get_comm())
414 if(fstrdynamic%idx_mas == 1)
then
415 call setmass(fstrsolid,hecmesh,hecmat,fstreig)
418 else if(fstrdynamic%idx_mas == 2)
then
419 if( hecmesh%my_rank .eq. 0 )
then
420 write(
imsg,*)
'stop: consistent mass matrix is not yet available !'
422 call hecmw_abort( hecmw_comm_get_comm())
425 hecmat%Iarray(98) = 1
426 hecmat%Iarray(97) = 1
429 if( restrt_step_num == 1 .and. fstrdynamic%VarInitialize .and. fstrdynamic%ray_m /= 0.0d0 ) &
433 a1 = .5d0/fstrdynamic%beta - 1.d0
434 a2 = 1.d0/(fstrdynamic%beta*fstrdynamic%t_delta)
435 a3 = 1.d0/(fstrdynamic%beta*fstrdynamic%t_delta*fstrdynamic%t_delta)
436 b1 = ( .5d0*fstrdynamic%gamma/fstrdynamic%beta - 1.d0 )*fstrdynamic%t_delta
437 b2 = fstrdynamic%gamma/fstrdynamic%beta - 1.d0
438 b3 = fstrdynamic%gamma/(fstrdynamic%beta*fstrdynamic%t_delta)
439 c1 = 1.d0 + fstrdynamic%ray_k*b3
440 c2 = a3 + fstrdynamic%ray_m*b3
443 if( restrt_step_num == 1 )
then
448 fstrdynamic%VEC3(:) =0.d0
452 call fstr_scan_contact_state(cstep, restrt_step_num, 0, fstrdynamic%t_delta, ctalgo, hecmesh, fstrsolid, infoctchange)
454 call hecmw_mat_copy_profile( hecmat, conmat )
458 elseif( hecmat%Iarray(99)==4 )
then
459 write(*,*)
' This type of direct solver is not yet available in such case ! '
460 write(*,*)
' Please change solver type to intel MKL direct solver !'
461 call hecmw_abort(hecmw_comm_get_comm())
466 max_iter_contact = fstrsolid%step_ctrl(cstep)%max_contiter
467 converg_dlag = fstrsolid%step_ctrl(cstep)%converg_lag
470 do i = restrt_step_num, fstrdynamic%n_step
471 if (ndof == 4 .and. hecmesh%my_rank==0)
write(*,
'(a,i5)')
"iter: ",i
473 fstrdynamic%i_step = i
474 fstrdynamic%t_curr = fstrdynamic%t_delta * i
476 if(hecmesh%my_rank==0)
then
477 write(
ista,
'('' time step='',i10,'' time='',1pe13.4e3)') i,fstrdynamic%t_curr
478 write(*,
'(A)')
'-------------------------------------------------'
479 write(*,
'('' time step='',i10,'' time='',1pe13.4e3)') i,fstrdynamic%t_curr
483 fstrdynamic%VEC1(j) = a1*fstrdynamic%ACC(j,1) + a2*fstrdynamic%VEL(j,1)
484 fstrdynamic%VEC2(j) = b1*fstrdynamic%ACC(j,1) + b2*fstrdynamic%VEL(j,1)
492 fstrsolid%dunode(:) =0.d0
496 loopforcontactanalysis:
do while( .true. )
497 count_step = count_step + 1
504 do iter = 1, fstrsolid%step_ctrl(cstep)%max_iter
506 if (fstrparam%nlgeom)
then
507 call fstr_stiffmatrix( hecmesh, hecmat, fstrsolid, fstrdynamic%t_curr, fstrdynamic%t_delta )
509 if (.not.
associated(hecmat0))
then
510 call fstr_stiffmatrix( hecmesh, hecmat, fstrsolid, fstrdynamic%t_curr, fstrdynamic%t_delta )
512 call hecmw_mat_init(hecmat0)
513 call hecmw_mat_copy_profile(hecmat, hecmat0)
514 call hecmw_mat_copy_val(hecmat, hecmat0)
516 call hecmw_mat_copy_val(hecmat0, hecmat)
520 if( fstrdynamic%ray_k/=0.d0 .or. fstrdynamic%ray_m/=0.d0 )
then
522 hecmat%X(j) = fstrdynamic%VEC2(j) - b3*fstrsolid%dunode(j)
525 if( fstrdynamic%ray_k/=0.d0 )
then
526 if( hecmesh%n_dof == 3 )
then
527 call hecmw_matvec (hecmesh, hecmat, hecmat%X, fstrdynamic%VEC3)
528 else if( hecmesh%n_dof == 2 )
then
529 call hecmw_matvec (hecmesh, hecmat, hecmat%X, fstrdynamic%VEC3)
530 else if( hecmesh%n_dof == 6 )
then
531 call matvec(fstrdynamic%VEC3, hecmat%X, hecmat, ndof, hecmat%D, hecmat%AU, hecmat%AL)
537 do j=1, hecmesh%n_node* hecmesh%n_dof
538 hecmat%B(j)=hecmat%B(j)- fstrsolid%QFORCE(j) + fstreig%mass(j)*( fstrdynamic%VEC1(j)-a3*fstrsolid%dunode(j) &
539 + fstrdynamic%ray_m* hecmat%X(j) ) + fstrdynamic%ray_k*fstrdynamic%VEC3(j)
544 & fstrparam, fstrdynamic, fstrcpl, restrt_step_num, pi, i)
546 do j = 1 ,nn*hecmat%NP
547 hecmat%D(j) = c1* hecmat%D(j)
549 do j = 1 ,nn*hecmat%NPU
550 hecmat%AU(j) = c1* hecmat%AU(j)
552 do j = 1 ,nn*hecmat%NPL
553 hecmat%AL(j) = c1*hecmat%AL(j)
557 idm = nn*(j-1)+1 + (ndof+1)*(kk-1)
558 imm = ndof*(j-1) + kk
559 hecmat%D(idm) = hecmat%D(idm) + c2*fstreig%mass(imm)
563 call hecmw_mat_clear( conmat )
564 call hecmw_mat_clear_b( conmat )
573 call dynamic_mat_ass_bc (hecmesh, hecmat, fstrsolid, fstrdynamic, fstrparam, heclagmat, stepcnt, conmat=conmat)
574 call dynamic_mat_ass_bc_vl(hecmesh, hecmat, fstrsolid, fstrdynamic, fstrparam, heclagmat, stepcnt, conmat=conmat)
575 call dynamic_mat_ass_bc_ac(hecmesh, hecmat, fstrsolid, fstrdynamic, fstrparam, heclagmat, stepcnt, conmat=conmat)
587 elseif( maxdlag == 0.0d0)
then
590 call hecmw_allreduce_r1(hecmesh, maxdlag, hecmw_max)
592 res = dsqrt(res/res0)
593 if( fstrparam%nlgeom .and. ndof /= 4 )
then
594 if( hecmesh%my_rank==0 )
then
595 write(*,
'(a,i5,a,1pe12.4)')
"iter: ",iter,
", res: ",res
596 write(
ista,
'(''iter='',I5,''- Residual'',E15.7)')iter,res
597 write(*,
'(a,1e15.7)')
' - MaxDLag =',maxdlag
598 write(
ista,
'(a,1e15.7)')
' - MaxDLag =',maxdlag
600 if( res<fstrsolid%step_ctrl(cstep)%converg .and. maxdlag < converg_dlag )
exit
610 call hecmw_update_r (hecmesh, hecmat%X, hecmat%NP, hecmat%NDOF)
613 do j=1,hecmesh%n_node*ndof
614 fstrsolid%dunode(j) = fstrsolid%dunode(j)+hecmat%X(j)
617 & fstrdynamic%t_delta,iter, fstrdynamic%strainEnergy )
619 if(.not. fstrparam%nlgeom)
exit
625 do j=1,heclagmat%num_lagrange
626 heclagmat%lagrange(j) = heclagmat%lagrange(j) + hecmat%X(hecmesh%n_node*ndof+j)
627 if(dabs(hecmat%X(hecmesh%n_node*ndof+j))>maxdlag) maxdlag=dabs(hecmat%X(hecmesh%n_node*ndof+j))
634 if( iter>fstrsolid%step_ctrl(cstep)%max_iter )
then
635 if( hecmesh%my_rank==0)
then
636 write(
ilog,*)
'### Fail to Converge : at step=', i
637 write(
ista,*)
'### Fail to Converge : at step=', i
638 write( *,*)
' ### Fail to Converge : at step=', i
647 call fstr_scan_contact_state(cstep, i, count_step, fstrdynamic%t_delta, ctalgo, hecmesh, fstrsolid, infoctchange)
650 write(*,*)
' This type of direct solver is not yet available in such case ! '
651 write(*,*)
' Please use intel MKL direct solver !'
652 call hecmw_abort(hecmw_comm_get_comm())
656 contact_changed_global=0
658 exit loopforcontactanalysis
661 contact_changed_global=1
663 call hecmw_allreduce_i1(hecmesh,contact_changed_global,hecmw_max)
664 if (contact_changed_global > 0)
then
665 call hecmw_mat_clear_b( hecmat )
666 call hecmw_mat_clear_b( conmat )
670 if( count_step > max_iter_contact )
exit loopforcontactanalysis
672 enddo loopforcontactanalysis
676 & fstrparam, fstrdynamic, fstrcpl, a1, a2, a3, b1, b2, b3, i, is_cycle)
682 fstrdynamic%kineticEnergy = 0.0d0
684 fstrdynamic%ACC (j,2) = -a1*fstrdynamic%ACC(j,1) - a2*fstrdynamic%VEL(j,1) + &
685 a3*fstrsolid%dunode(j)
686 fstrdynamic%VEL (j,2) = -b1*fstrdynamic%ACC(j,1) - b2*fstrdynamic%VEL(j,1) + &
687 b3*fstrsolid%dunode(j)
688 fstrdynamic%ACC (j,1) = fstrdynamic%ACC (j,2)
689 fstrdynamic%VEL (j,1) = fstrdynamic%VEL (j,2)
691 fstrsolid%unode(j) = fstrsolid%unode(j)+fstrsolid%dunode(j)
692 fstrdynamic%DISP(j,2) = fstrsolid%unode(j)
694 fstrdynamic%kineticEnergy = fstrdynamic%kineticEnergy + &
695 0.5d0*fstreig%mass(j)*fstrdynamic%VEL(j,2)*fstrdynamic%VEL(j,2)
707 if( fstrdynamic%restart_nout > 0 )
then
708 if( mod(i,fstrdynamic%restart_nout).eq.0 .or. i.eq.fstrdynamic%n_step )
then
710 infoctchange%contactNode_current)
717 if (
associated(hecmat0))
then
718 call hecmw_mat_finalize(hecmat0)
722 time_2 = hecmw_wtime()
723 if( hecmesh%my_rank == 0 )
then
724 write(
ista,
'(a,f10.2,a)')
' solve (sec) :', time_2 - time_1,
's'
734 if( fstrparam%fg_couple == 1)
then
735 if( fstrparam%fg_couple_type==1 .or. &
736 fstrparam%fg_couple_type==3 .or. &
742 & fstrPARAM, fstrDYNAMIC, fstrCPL, restrt_step_num, PI, i)
744 type(hecmwst_local_mesh) :: hecMESH
745 type(hecmwst_matrix) :: hecMAT
750 integer(kint) :: kkk0, kkk1, j, kk, i, restrt_step_num
751 real(kreal) :: bsize, PI
753 if( fstrparam%fg_couple == 1)
then
754 if( fstrparam%fg_couple_first /= 0 )
then
755 bsize = dfloat( i ) / dfloat( fstrparam%fg_couple_first )
756 if( bsize > 1.0 ) bsize = 1.0
757 do kkk0 = 1, fstrcpl%coupled_node_n
759 fstrcpl%trac(kkk1-2) = bsize * fstrcpl%trac(kkk1-2)
760 fstrcpl%trac(kkk1-1) = bsize * fstrcpl%trac(kkk1-1)
761 fstrcpl%trac(kkk1 ) = bsize * fstrcpl%trac(kkk1 )
764 if( fstrparam%fg_couple_window > 0 )
then
765 j = i - restrt_step_num + 1
766 kk = fstrdynamic%n_step - restrt_step_num + 1
767 bsize = 0.5*(1.0-cos(2.0*pi*dfloat(j)/dfloat(kk)))
768 do kkk0 = 1, fstrcpl%coupled_node_n
770 fstrcpl%trac(kkk1-2) = bsize * fstrcpl%trac(kkk1-2)
771 fstrcpl%trac(kkk1-1) = bsize * fstrcpl%trac(kkk1-1)
772 fstrcpl%trac(kkk1 ) = bsize * fstrcpl%trac(kkk1 )
780 & fstrPARAM, fstrDYNAMIC, fstrCPL, a1, a2, a3, b1, b2, b3, i, is_cycle)
782 type(hecmwst_local_mesh) :: hecMESH
783 type(hecmwst_matrix) :: hecMAT
788 integer(kint) :: kkk0, kkk1, j, i, revocap_flag
789 real(kreal) :: bsize, a1, a2, a3, b1, b2, b3
794 if( fstrparam%fg_couple == 1 )
then
795 if( fstrparam%fg_couple_type>1 )
then
796 do j=1, fstrcpl%coupled_node_n
797 if( fstrcpl%dof == 3 )
then
799 kkk1 = fstrcpl%coupled_node(j)*3
801 fstrcpl%disp (kkk0-2) = fstrsolid%unode(kkk1-2) + fstrsolid%dunode(kkk1-2)
802 fstrcpl%disp (kkk0-1) = fstrsolid%unode(kkk1-1) + fstrsolid%dunode(kkk1-1)
803 fstrcpl%disp (kkk0 ) = fstrsolid%unode(kkk1 ) + fstrsolid%dunode(kkk1 )
805 fstrcpl%velo (kkk0-2) = -b1*fstrdynamic%ACC(kkk1-2,1) - b2*fstrdynamic%VEL(kkk1-2,1) + &
806 b3*fstrsolid%dunode(kkk1-2)
807 fstrcpl%velo (kkk0-1) = -b1*fstrdynamic%ACC(kkk1-1,1) - b2*fstrdynamic%VEL(kkk1-1,1) + &
808 b3*fstrsolid%dunode(kkk1-1)
809 fstrcpl%velo (kkk0 ) = -b1*fstrdynamic%ACC(kkk1,1) - b2*fstrdynamic%VEL(kkk1,1) + &
810 b3*fstrsolid%dunode(kkk1)
811 fstrcpl%accel(kkk0-2) = -a1*fstrdynamic%ACC(kkk1-2,1) - a2*fstrdynamic%VEL(kkk1-2,1) + &
812 a3*fstrsolid%dunode(kkk1-2)
813 fstrcpl%accel(kkk0-1) = -a1*fstrdynamic%ACC(kkk1-1,1) - a2*fstrdynamic%VEL(kkk1-1,1) + &
814 a3*fstrsolid%dunode(kkk1-1)
815 fstrcpl%accel(kkk0 ) = -a1*fstrdynamic%ACC(kkk1,1) - a2*fstrdynamic%VEL(kkk1,1) + &
816 a3*fstrsolid%dunode(kkk1)
819 kkk1 = fstrcpl%coupled_node(j)*2
821 fstrcpl%disp (kkk0-1) = fstrsolid%unode(kkk1-1) + fstrsolid%dunode(kkk1-1)
822 fstrcpl%disp (kkk0 ) = fstrsolid%unode(kkk1 ) + fstrsolid%dunode(kkk1 )
824 fstrcpl%velo (kkk0-1) = -b1*fstrdynamic%ACC(kkk1-1,1) - b2*fstrdynamic%VEL(kkk1-1,1) + &
825 b3*fstrsolid%dunode(kkk1-1)
826 fstrcpl%velo (kkk0 ) = -b1*fstrdynamic%ACC(kkk1,1) - b2*fstrdynamic%VEL(kkk1,1) + &
827 b3*fstrsolid%dunode(kkk1)
828 fstrcpl%accel(kkk0-1) = -a1*fstrdynamic%ACC(kkk1-1,1) - a2*fstrdynamic%VEL(kkk1-1,1) + &
829 a3*fstrsolid%dunode(kkk1-1)
830 fstrcpl%accel(kkk0 ) = -a1*fstrdynamic%ACC(kkk1,1) - a2*fstrdynamic%VEL(kkk1,1) + &
831 a3*fstrsolid%dunode(kkk1)
837 select case ( fstrparam%fg_couple_type )
842 if( revocap_flag==0 ) is_cycle = .true.
845 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_post(hecMESH, hecMAT, fstrSOLID, fstrPARAM, fstrDYNAMIC, fstrCPL, a1, a2, a3, b1, b2, b3, i, is_cycle)
subroutine fstr_solve_dynamic_nlimplicit(cstep, hecMESH, hecMAT, fstrSOLID, fstrEIG, fstrDYNAMIC, fstrRESULT, fstrPARAM, fstrCPL, restrt_step_num)
This subroutine provides function of nonlinear implicit dynamic analysis using the Newmark method.
subroutine fstr_solve_dynamic_nlimplicit_couple_pre(hecMESH, hecMAT, fstrSOLID, fstrPARAM, fstrDYNAMIC, fstrCPL, restrt_step_num, PI, i)
subroutine fstr_solve_dynamic_nlimplicit_contactslag(cstep, hecMESH, hecMAT, fstrSOLID, fstrEIG, fstrDYNAMIC, fstrRESULT, fstrPARAM, fstrCPL, hecLagMAT, restrt_step_num, infoCTChange, conMAT)
This subroutine provides function of nonlinear implicit dynamic analysis using the Newmark method....
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(hecMESH, hecMAT, fstrSOLID, fstrDYNAMIC, fstrPARAM, hecLagMAT, 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(hecMESH, hecMAT, fstrSOLID, fstrDYNAMIC, fstrPARAM, hecLagMAT, 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(hecMESH, hecMAT, fstrSOLID, fstrDYNAMIC, fstrPARAM, hecLagMAT, 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(hecMESH, hecMAT, fstrSOLID, fstrDYNAMIC, fstrPARAM, iter)
This function sets boundary condition of external load.
This module provides functions to output result.
subroutine dynamic_output_monit(hecMESH, fstrPARAM, fstrDYNAMIC, fstrEIG, fstrSOLID)
subroutine matvec(y, x, hecMAT, ndof, D, AU, AL)
subroutine fstr_dynamic_output(hecMESH, fstrSOLID, fstrDYNAMIC, fstrPARAM)
Output result.
Set up lumped mass matrix.
subroutine setmass(fstrSOLID, hecMESH, hecMAT, fstrEIG)
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.
real(kind=kreal) function, public fstr_get_norm_para_contact(hecMAT, hecLagMAT, conMAT, hecMESH)
This module provides functions to read in and write out restart files.
subroutine fstr_write_restart_dyna_nl(cstep, hecMESH, fstrSOLID, fstrDYNAMIC, fstrPARAM, contactNode)
write out restart file for nonlinear dynamic analysis
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.
subroutine fstr_recover_initial_config_to_mesh(hecMESH, fstrSOLID, coord)
integer(kind=kint), parameter imsg
integer(kind=kint), parameter ilog
FILE HANDLER.
subroutine fstr_set_current_config_to_mesh(hecMESH, fstrSOLID, coord)
integer(kind=kint), parameter ista
Data for coupling analysis.
Data for DYNAMIC ANSLYSIS (fstrDYNAMIC)
Package of data used by Lanczos eigenvalue solver.
FSTR INNER CONTROL PARAMETERS (fstrPARAM)