13 type(hecmwst_local_mesh),
intent(in) :: hecMESH
14 integer(kind=kint),
intent(in) :: numcomp
15 type(hecmwst_result_data),
intent(inout) :: fstrRESULT
19 call hecmw_nullify_result_data(fstrresult)
20 fstrresult%ng_component = 0
21 fstrresult%nn_component = numcomp
22 fstrresult%ne_component = 0
23 allocate( fstrresult%nn_dof(numcomp) )
24 allocate( fstrresult%node_label(numcomp) )
25 allocate( fstrresult%node_val_item(numcomp*hecmesh%n_dof*hecmesh%n_node))
30 type(hecmwst_result_data),
intent(inout) :: fstrRESULT
31 type(hecmwst_local_mesh),
intent(in) :: hecMESH
32 integer(kind=kint),
intent(in) :: comp_index
33 integer(kind=kint),
intent(in) :: ndof
34 character(len=HECMW_NAME_LEN),
intent(in) :: label
35 real(kind=kreal),
intent(in) :: vect(:)
37 integer(kind=kint) :: i, k, alldof, offset
40 fstrresult%nn_dof(comp_index) = ndof
41 fstrresult%node_label(comp_index) = label
42 alldof = fstrresult%nn_component*ndof
43 offset = ndof*(comp_index-1)
44 do i=1, hecmesh%n_node
46 fstrresult%node_val_item(alldof*(i-1) + k + offset) = vect(ndof*(i-1) + k)
69 fstrDYNAMIC, fstrRESULT, fstrPARAM, &
70 fstrCPL, fstrFREQ, hecLagMAT, restart_step_num)
74 type(hecmwst_local_mesh) :: hecMESH
75 type(hecmwst_matrix) :: hecMAT
78 type(hecmwst_result_data) :: fstrRESULT
83 type(hecmwst_matrix_lagrange) :: hecLagMAT
84 integer(kind=kint) :: restart_step_num
89 integer(kind=kint) :: numnode, numelm, startmode, endmode, nummode, ndof, im, in, ntotal, vistype
90 integer(kind=kint) :: numfreq, idnode, numdisp
91 integer(kind=kint) :: freqiout(3)
92 integer(kind=kint) :: ierr
93 integer(kind=kint),
parameter :: ilogin = 9056
94 real(kind=kreal),
allocatable :: eigenvalue(:), loadvecre(:), loadvecim(:)
95 real(kind=kreal),
allocatable :: bjre(:), bjim(:), dvare(:), dvaim(:), disp(:), vel(:), acc(:)
96 real(kind=kreal),
allocatable :: dispre(:), dispim(:), velre(:), velim(:), accre(:), accim(:)
97 real(kind=kreal) :: freq, omega, val, dx, dy, dz, f_start, f_end
98 real(kind=kreal) :: t_start, t_end, time, dxi, dyi, dzi
101 numnode = hecmesh%nn_internal
102 numelm = hecmesh%n_elem
104 startmode = fstrfreq%start_mode
105 endmode = fstrfreq%end_mode
106 nummode = endmode - startmode +1
108 freqdata%numMode = nummode
109 freqdata%numNodeDOF = numnode*ndof
110 allocate(freqdata%eigOmega(nummode))
111 allocate(freqdata%eigVector(numnode*ndof, nummode))
113 call setupfreqparam(fstrdynamic, f_start, f_end, numfreq, freqdata%rayAlpha, freqdata%rayBeta, idnode, vistype, freqiout)
114 write(*,*)
"Rayleigh alpha:", freqdata%rayAlpha
115 write(*,*)
"Rayleigh beta:", freqdata%rayBeta
116 write(
ilog,*)
"Rayleigh alpha:", freqdata%rayAlpha
117 write(
ilog,*)
"Rayleigh beta:", freqdata%rayBeta
120 allocate(eigenvalue(nummode))
121 allocate(loadvecre(numnode*ndof))
122 allocate(loadvecim(numnode*ndof))
123 allocate(bjre(nummode))
124 allocate(bjim(nummode))
125 allocate(dvare(numnode*ndof))
126 allocate(dvaim(numnode*ndof))
127 allocate(disp(numnode*ndof))
128 allocate(vel(numnode*ndof))
129 allocate(acc(numnode*ndof))
130 allocate(dispre(numnode*ndof))
131 allocate(dispim(numnode*ndof))
132 allocate(velre(numnode*ndof))
133 allocate(velim(numnode*ndof))
134 allocate(accre(numnode*ndof))
135 allocate(accim(numnode*ndof))
140 write(*,*)
"--frequency analysis--"
141 write(*, *)
"read from=", trim(fstrfreq%eigenlog_filename)
142 write(
ilog,*)
"read from=", trim(fstrfreq%eigenlog_filename)
143 write(*, *)
"start mode=", startmode
144 write(
ilog,*)
"start mode=", startmode
145 write(*, *)
"end mode=", endmode
146 write(
ilog,*)
"end mode=", endmode
147 open(unit=ilogin, file=trim(fstrfreq%eigenlog_filename), status=
"OLD", action=
"READ", iostat=ierr)
149 write(*,*)
"Error: cannot open eigenlog file: ", trim(fstrfreq%eigenlog_filename)
150 call hecmw_abort( hecmw_comm_get_comm() )
152 call read_eigen_values(ilogin, startmode, endmode, eigenvalue, freqdata%eigOmega)
161 write(*,*)
"calc mass matrix"
162 call calcmassmatrix(fstrparam, hecmesh, hecmat, fstrsolid, fstreig, heclagmat)
163 write(*,*)
"scale eigenvector"
166 write(*, *)
"start frequency:", f_start
167 write(
ilog,*)
"start frequency:", f_start
168 write(*, *)
"end frequency:", f_end
169 write(
ilog,*)
"end frequency:", f_end
170 write(* ,*)
"number of the sampling points", numfreq
171 write(
ilog,*)
"number of the sampling points", numfreq
172 write(* ,*)
"monitor nodeid=", idnode
173 write(
ilog,*)
"monitor nodeid=", idnode
176 freq = (f_end-f_start)/dble(numfreq)*dble(im) + f_start
177 omega = 2.0d0 * 3.14159265358979d0 * freq
179 call calcfreqcoeff(freqdata, loadvecre, loadvecim, omega, bjre, bjim)
182 dx = sqrt(dvare(3*(idnode-1)+1)**2 + dvaim(3*(idnode-1)+1)**2)
183 dy = sqrt(dvare(3*(idnode-1)+2)**2 + dvaim(3*(idnode-1)+2)**2)
184 dz = sqrt(dvare(3*(idnode-1)+3)**2 + dvaim(3*(idnode-1)+3)**2)
185 val = sqrt(dx**2 + dy**2 + dz**2)
186 write(*, *) freq,
"[Hz] : ", val
187 write(
ilog, *) freq,
"[Hz] : ", val
188 disp(:) = abs(cmplx(dvare(:), dvaim(:)))
190 call calcvelvector(freqdata, omega, bjre, bjim, dvare, dvaim)
191 vel(:) = abs(cmplx(dvare(:), dvaim(:)))
193 call calcaccvector(freqdata, omega, bjre, bjim, dvare, dvaim)
194 acc(:) = abs(cmplx(dvare(:), dvaim(:)))
197 write(*, *) freq,
"[Hz] : ", im,
".res"
198 write(
ilog,*) freq,
"[Hz] : ", im,
".res"
201 if(
ivisual==1 .and. vistype==1)
then
202 write(*, *) freq,
"[Hz] : ", im,
".vis"
203 write(
ilog,*) freq,
"[Hz] : ", im,
".vis"
209 write(*, *)
"start time:", t_start
210 write(
ilog,*)
"start time:", t_start
211 write(*, *)
"end time:", t_end
212 write(
ilog,*)
"end time:", t_end
213 write(*, *)
"frequency:", freq
214 write(
ilog,*)
"frequency:", freq
215 write(*, *)
"node id:", idnode
216 write(
ilog,*)
"node id:", idnode
217 write(*, *)
"num disp:", numdisp
218 write(
ilog,*)
"num disp:", numdisp
220 omega = 2.0d0 * 3.14159265358979d0 * freq
221 call calcfreqcoeff(freqdata, loadvecre, loadvecim, omega, bjre, bjim)
225 time = (t_end-t_start)/dble(numdisp)*dble(im-1) + t_start
227 dx = dvare(3*(idnode-1)+1)
228 dy = dvare(3*(idnode-1)+2)
229 dz = dvare(3*(idnode-1)+3)
230 dxi = dvaim(3*(idnode-1)+1)
231 dyi = dvaim(3*(idnode-1)+2)
232 dzi = dvaim(3*(idnode-1)+3)
237 write(*, *)
"time=", time,
" : ", im,
".res"
238 write(
ilog,*)
"time=", time,
" : ", im,
".res"
239 call outputdyna_resfile(hecmesh, time, im, dvare, dvaim, velre, velim, accre, accim, freqiout)
241 if(
ivisual==1 .and. vistype==2)
then
242 write(*, *)
"time=", time,
" : ", im,
".vis"
243 write(
ilog,*)
"time=", time,
" : ", im,
".vis"
244 call outputdyna_visfile(hecmesh, im, dvare, dvaim, velre, velim, accre, accim, freqiout)
248 deallocate(freqdata%eigOmega)
249 deallocate(freqdata%eigVector)
250 deallocate(eigenvalue)
251 deallocate(loadvecre)
252 deallocate(loadvecim)
271 integer(kind=kint),
intent(in) :: logfile
272 integer(kind=kint),
intent(in) :: startmode
273 integer(kind=kint),
intent(in) :: endmode
274 real(kind=kreal),
intent(inout) :: eigenvalue(:)
275 real(kind=kreal),
intent(inout) :: anglfreq(:)
277 integer(kind=kint) :: im, endflag, id
278 character(len=HECMW_MSG_LEN) :: line
279 real(kind=kreal) :: freq
286 read(logfile,
'(A80)', err=119) line
287 if(trim(adjustl(line)) ==
"NO. EIGENVALUE FREQUENCY (HZ) X Y Z X")
then
292 read(logfile,
'(A80)') line
295 read(logfile,
'(A80)') line
297 do im=1, (endmode-startmode+1)
298 read(logfile,
'(i5,3e12.4,a)', err=119) id, eigenvalue(im), anglfreq(im), freq, line
303 119
write(*,*)
"Error to find eigenvalue information from logfile"
304 write(
ilog,*)
"Error to find eigenvalue information from logfile"
310 integer(kind=kint),
intent(in) :: logfile
311 integer(kind=kint),
intent(in) :: startmode
312 integer(kind=kint),
intent(in) :: endmode
313 integer(kind=kint),
intent(in) :: numdof
314 integer(kind=kint),
intent(in) :: numnode
315 real(kind=kreal),
intent(inout) :: eigenvector(:, :)
317 integer(kind=kint) :: im, in, gblid, j, idx
318 real(kind=kreal) :: vec(6)
319 character(len=HECMW_MSG_LEN) :: line
326 read(logfile,
'(a80)', err=119,
end=119) line
327 if(line(1:9) ==
" Mode No.")
then
334 do im=1, (endmode-startmode+1)
337 read(logfile,
'(a80)', err=119,
end=119) line
338 if(line(1:9) ==
" Mode No.")
then
343 read(logfile,
'(a80)', err=119) line
344 read(logfile,
'(a80)', err=119) line
345 read(logfile,
'(a80)', err=119) line
346 read(logfile,
'(a80)', err=119) line
351 read(logfile,
'(i10,2e12.4)', err=119) gblid, (vec(j), j=1,2)
355 read(logfile,
'(i10,3e16.8)', err=119) gblid, (vec(j), j=1,3)
358 read(logfile,
'(i10,6e12.4)', err=119) gblid, (vec(j), j=1,6)
365 idx = (in-1)*numdof + j
366 eigenvector(idx,im) = vec(j)
373 119
write(*,*)
"Error to find eigenvector from logfile"
374 write(ilog,*)
"Error to find eigenvector from logfile"
381 type(hecmwst_local_mesh),
intent(in) :: hecMESH
382 integer(kind=kint),
intent(in) :: startmode
383 integer(kind=kint),
intent(in) :: endmode
384 integer(kind=kint),
intent(in) :: numdof
385 integer(kind=kint),
intent(in) :: numnode
386 real(kind=kreal),
intent(inout) :: eigenvector(:, :)
388 integer(kind=kint),
parameter :: compidx = 1
389 integer(kind=kint) :: imode, idx, ind, a, b, nallcomp, j
390 type(hecmwst_result_data) :: eigenres
391 character(len=HECMW_NAME_LEN) :: name
395 do imode=startmode, endmode
397 call hecmw_result_read_by_name(hecmesh, name, imode, eigenres)
400 do ind=1,eigenres%nn_component
401 nallcomp = nallcomp + eigenres%nn_dof(ind)
404 idx = imode - startmode + 1
407 a = (ind-1)*nallcomp + j
408 b = (ind-1)*numdof + j
409 eigenvector(b,imode) = eigenres%node_val_item(a)
419 type(hecmwst_result_data) :: res
422 if(
associated(res%nn_dof))
deallocate(res%nn_dof)
423 if(
associated(res%ne_dof))
deallocate(res%ne_dof)
424 if(
associated(res%node_label))
deallocate(res%node_label)
425 if(
associated(res%elem_label))
deallocate(res%elem_label)
426 if(
associated(res%node_val_item))
deallocate(res%node_val_item)
427 if(
associated(res%elem_val_item))
deallocate(res%elem_val_item)
432 type(hecmwst_result_data) :: res
437 nullify(res%node_label)
438 nullify(res%elem_label)
439 nullify(res%node_val_item)
440 nullify(res%elem_val_item)
448 type(hecmwst_local_mesh),
intent(in) :: hecMESH
449 real(kind=kreal),
intent(in) :: freq
450 integer(kind=kint),
intent(in) :: ifreq
451 real(kind=kreal),
intent(in) :: disp(:)
452 real(kind=kreal),
intent(in) :: vel(:)
453 real(kind=kreal),
intent(in) :: acc(:)
454 integer(kind=kint),
intent(in) :: iout(3)
456 integer(kind=kint) :: im
457 character(len=HECMW_HEADER_LEN) :: header
458 character(len=HECMW_MSG_LEN) :: comment
459 character(len=HECMW_NAME_LEN) :: label, nameid
460 real(kind=kreal) :: freqval(1)
465 comment=
'frequency_result'
466 call hecmw_result_init(hecmesh, ifreq, header, comment)
470 call hecmw_result_add(hecmw_result_dtype_global, 1, label, freqval)
472 if(iout(1) == 1)
then
474 call hecmw_result_add(hecmw_result_dtype_node, 3, label, disp)
476 if(iout(2) == 1)
then
478 call hecmw_result_add(hecmw_result_dtype_node, 3, label, vel)
480 if(iout(3) == 1)
then
482 call hecmw_result_add(hecmw_result_dtype_node, 3, label, acc)
484 call hecmw_result_write_by_name(nameid)
485 call hecmw_result_finalize()
491 type(hecmwst_local_mesh),
intent(in) :: hecmesh
492 integer(kind=kint),
intent(in) :: ifreq
493 real(kind=kreal),
intent(in) :: disp(:)
494 real(kind=kreal),
intent(in) :: vel(:)
495 real(kind=kreal),
intent(in) :: acc(:)
496 integer(kind=kint),
intent(in) :: iout(3)
498 type(hecmwst_result_data) :: fstrRESULT
499 character(len=HECMW_NAME_LEN) :: label
500 integer(kind=kint) :: ncomp, i
504 if(iout(i) == 1)
then
509 call fstr_freq_result_init(hecmesh, ncomp, fstrresult)
511 if(iout(1) == 1)
then
512 label =
'displace_abs'
513 call fstr_freq_result_add(fstrresult, hecmesh, ncomp, 3, label, disp)
516 if(iout(2) == 1)
then
517 label =
'velocity_abs'
518 call fstr_freq_result_add(fstrresult, hecmesh, ncomp, 3, label, vel)
521 if(iout(3) == 1)
then
522 label =
'acceleration_abs'
523 call fstr_freq_result_add(fstrresult, hecmesh, ncomp, 3, label, acc)
527 call fstr2hecmw_mesh_conv(hecmesh)
528 call hecmw_visualize_init
529 call hecmw_visualize( hecmesh, fstrresult, ifreq )
530 call hecmw2fstr_mesh_conv(hecmesh)
531 call hecmw_result_free(fstrresult)
536 type(hecmwst_local_mesh),
intent(in) :: hecMESH
537 type(fstr_freqanalysis),
intent(in) :: freqData
538 integer(kind=kint),
intent(in) :: numdof
539 real(kind=kreal),
intent(inout) :: loadvecre(:)
540 real(kind=kreal),
intent(inout) :: loadvecim(:)
542 integer(kind=kint),
parameter :: MAXNODE = 100
543 integer(kind=kint) :: sgrpID, is, ie, ic, nsurf, ic_type, outtype, node_index(MAXNODE)
544 integer(kind=kint) :: nn, iss, nodeid, dof_index, ndof
545 integer(kind=kint) :: i, j, k, l, m, isn, nsize
546 integer(kind=kint) :: iwk(60), nodLOCAL(20)
547 real(kind=kreal) :: vect(60), xx(20), yy(20), zz(20), forcere(3), forceim(3)
551 do i=1,freqdata%FLOAD_ngrp_tot
552 if(freqdata%FLOAD_ngrp_TYPE(i) == kfloadtype_surf)
then
553 sgrpid = freqdata%FLOAD_ngrp_ID(i)
554 dof_index = freqdata%FLOAD_ngrp_DOF(i)
557 forcere(dof_index) = freqdata%FLOAD_ngrp_valre(i)
558 forceim(dof_index) = freqdata%FLOAD_ngrp_valim(i)
560 is = hecmesh%surf_group%grp_index(sgrpid-1) + 1
561 ie = hecmesh%surf_group%grp_index(sgrpid)
563 ic = hecmesh%surf_group%grp_item(2*j-1)
564 nsurf = hecmesh%surf_group%grp_item(2*j)
565 ic_type = hecmesh%elem_type(ic)
566 nn = hecmw_get_max_node(ic_type)
567 isn = hecmesh%elem_node_index(ic-1)
569 nodlocal(k) = hecmesh%elem_node_item(isn+k)
570 xx(k) = hecmesh%node(3*nodlocal(k)-2)
571 yy(k) = hecmesh%node(3*nodlocal(k)-1)
572 zz(k) = hecmesh%node(3*nodlocal(k) )
574 iwk(ndof*(k-1)+l) = ndof*(nodlocal(k)-1)+l
578 call dl_c3_freq(ic_type, nn, xx, yy, zz, nsurf, forcere, vect, nsize)
580 loadvecre(iwk(k)) = loadvecre(iwk(k)) + vect(k)
583 call dl_c3_freq(ic_type, nn, xx, yy, zz, nsurf, forceim, vect, nsize)
585 loadvecim(iwk(k)) = loadvecim(iwk(k)) + vect(k)
594 subroutine dl_c3_freq(ETYPE, NN, XX, YY, ZZ, LTYPE, force, VECT, nsize)
596 integer(kind=kint),
intent(in) :: ETYPE
597 integer(kind=kint),
intent(in) :: NN
598 integer(kind=kint),
intent(in) :: LTYPE
599 real(kind=kreal),
intent(in) :: xx(:)
600 real(kind=kreal),
intent(in) :: yy(:)
601 real(kind=kreal),
intent(in) :: zz(:)
602 real(kind=kreal),
intent(in) :: force(3)
603 real(kind=kreal),
intent(inout) :: vect(:)
604 integer(kind=kint),
intent(inout) :: nsize
606 integer(kind=kint),
parameter :: NDOF = 3
607 real(kind=kreal) :: wg
608 integer(kind=kint) :: NOD(NN)
609 real(kind=kreal) :: elecoord(3, nn), localcoord(3)
610 real(kind=kreal) :: h(nn)
611 integer(kind=kint) :: I, IG2, NSUR, SURTYPE
614 call getsubface( etype, ltype, surtype, nod )
615 nsur = getnumberofnodes( surtype )
618 elecoord(1,i)=xx(nod(i))
619 elecoord(2,i)=yy(nod(i))
620 elecoord(3,i)=zz(nod(i))
623 vect(1:nsize) = 0.0d0
624 do ig2=1,numofquadpoints( surtype )
625 call getquadpoint( surtype, ig2, localcoord(1:2) )
626 call getshapefunc( surtype, localcoord(1:2), h(1:nsur) )
628 wg=getweight( surtype, ig2 )
630 vect(3*nod(i)-2)=vect(3*nod(i)-2)+wg*h(i)*force(1)
631 vect(3*nod(i)-1)=vect(3*nod(i)-1)+wg*h(i)*force(2)
632 vect(3*nod(i) )=vect(3*nod(i) )+wg*h(i)*force(3)
639 type(hecmwst_local_mesh),
intent(in) :: hecMESH
640 type(fstr_freqanalysis),
intent(in) :: freqData
641 integer(kind=kint),
intent(in) :: numdof
642 real(kind=kreal),
intent(inout) :: loadvecre(:)
643 real(kind=kreal),
intent(inout) :: loadvecim(:)
645 integer(kind=kint) :: i, vecsize, ig, is, ie, in, nodeid, dof_index
649 do i=1, freqdata%FLOAD_ngrp_tot
650 if(freqdata%FLOAD_ngrp_TYPE(i) == kfloadtype_node)
then
651 ig = freqdata%FLOAD_ngrp_ID(i)
652 is = hecmesh%node_group%grp_index(ig-1) + 1
653 ie = hecmesh%node_group%grp_index(ig)
655 nodeid = hecmesh%node_group%grp_item(in)
656 dof_index = freqdata%FLOAD_ngrp_DOF(i)
657 loadvecre((nodeid-1)*numdof + dof_index) = loadvecre((nodeid-1)*numdof + dof_index) + freqdata%FLOAD_ngrp_valre(i)
658 loadvecim((nodeid-1)*numdof + dof_index) = loadvecim((nodeid-1)*numdof + dof_index) + freqdata%FLOAD_ngrp_valim(i)
665 subroutine calcmassmatrix(fstrPARAM, hecMESH, hecMAT, fstrSOLID, fstrEIG, hecLagMAT)
667 type(fstr_param),
intent(in) :: fstrPARAM
668 type(hecmwst_local_mesh),
intent(in) :: hecMESH
669 type(hecmwst_matrix),
intent(inout) :: hecMAT
670 type(fstr_solid),
intent(inout) :: fstrSOLID
671 type(fstr_eigen),
intent(inout) :: fstrEIG
672 type(hecmwst_matrix_lagrange),
intent(inout) :: hecLagMAT
674 integer(kind=kint) :: ntotal
678 fstrsolid%dunode = 0.d0
679 call fstr_stiffmatrix( hecmesh, hecmat, fstrsolid, 0.d0, 0.d0 )
680 call fstr_addbc(1, hecmesh, hecmat, fstrsolid, fstrparam, heclagmat, 2)
682 call setmass(fstrsolid, hecmesh, hecmat, fstreig)
688 type(fstr_eigen),
intent(in) :: fstrEIG
689 integer(kind=kint),
intent(in) :: ntotaldof
690 integer(kind=kint),
intent(in) :: nmode
691 real(kind=kreal),
intent(inout) :: eigenvector(:, :)
693 integer(kind=kint) :: imode, idof
694 real(kind=kreal) :: mas
700 mas = mas + fstreig%mass(idof)*eigenvector(idof,imode)**2
703 eigenvector(idof,imode) = eigenvector(idof,imode) / sqrt(mas)
710 type(fstr_eigen),
intent(in) :: fstreig
711 real(kind=kreal),
intent(in) :: eigenvector(:, :)
712 integer(kind=kint),
intent(in) :: imode
713 integer(kind=kint),
intent(in) :: jmode
714 real(kind=kreal),
intent(inout) :: prod
716 integer(kind=kint) :: idof, s
718 s =
size(eigenvector(:,1))
722 prod = prod + eigenvector(idof,imode)*fstreig%mass(idof)*eigenvector(idof,jmode)
729 integer(kind=kint),
intent(in) :: im
730 real(kind=kreal),
intent(in) :: vector(:)
732 integer(kind=kint) :: i, s
737 write(*,
'("eigenvec",i2.2,":[",e12.5,", ")') im, vector(i)
739 write(*,
'(e12.5,", ")') vector(i)
741 write(*,
'(e12.5,"];")') vector(i)
750 real(kind=kreal),
intent(in) :: a(:)
751 real(kind=kreal),
intent(in) :: b(:)
752 real(kind=kreal),
intent(inout) :: c
755 c = dot_product(a, b)
762 type(fstr_freqanalysis_data),
intent(in) :: freqdata
763 real(kind=kreal),
intent(in) :: loadre(:)
764 real(kind=kreal),
intent(in) :: loadim(:)
765 real(kind=kreal),
intent(in) :: inpomega
766 real(kind=kreal),
intent(inout) :: bjre(:)
767 real(kind=kreal),
intent(inout) :: bjim(:)
769 integer(kind=kint) :: imode
770 real(kind=kreal) :: ujfr, ujfi, a, b, alp, beta
773 alp = freqdata%rayAlpha
774 beta = freqdata%rayBeta
776 do imode=1, freqdata%numMode
780 a = ujfr*(freqdata%eigOmega(imode)**2 - inpomega**2) + ujfi*(alp + beta*freqdata%eigOmega(imode)**2)*inpomega
781 b = (freqdata%eigOmega(imode)**2 - inpomega**2)**2 + ((alp + beta*freqdata%eigOmega(imode)**2)*inpomega)**2
784 a = ujfi*(freqdata%eigOmega(imode)**2 -inpomega**2) - ujfr*(alp + beta*freqdata%eigOmega(imode)**2)*inpomega
785 b = (freqdata%eigOmega(imode)**2 - inpomega**2)**2 + ((alp + beta*freqdata%eigOmega(imode)**2)*inpomega)**2
793 type(fstr_freqanalysis_data),
intent(in) :: freqdata
794 real(kind=kreal),
intent(in) :: bjre(:)
795 real(kind=kreal),
intent(in) :: bjim(:)
796 real(kind=kreal),
intent(inout) :: dispre(:)
797 real(kind=kreal),
intent(inout) :: dispim(:)
799 integer(kind=kint) :: imode
805 do imode=1, freqdata%numMode
806 dispre(:) = dispre(:) + bjre(imode)*freqdata%eigVector(:,imode)
807 dispim(:) = dispim(:) + bjim(imode)*freqdata%eigVector(:,imode)
814 type(fstr_freqanalysis_data),
intent(in) :: freqData
815 real(kind=kreal),
intent(in) :: omega
816 real(kind=kreal),
intent(in) :: bjre(:)
817 real(kind=kreal),
intent(in) :: bjim(:)
818 real(kind=kreal),
intent(inout) :: velre(:)
819 real(kind=kreal),
intent(inout) :: velim(:)
821 integer(kind=kint) :: imode
827 do imode=1, freqdata%numMode
828 velre(:) = velre(:) - omega * bjim(imode) * freqdata%eigVector(:,imode)
829 velim(:) = velim(:) + omega * bjre(imode) * freqdata%eigVector(:,imode)
835 type(fstr_freqanalysis_data),
intent(in) :: freqData
836 real(kind=kreal),
intent(in) :: omega
837 real(kind=kreal),
intent(in) :: bjre(:)
838 real(kind=kreal),
intent(in) :: bjim(:)
839 real(kind=kreal),
intent(inout) :: accre(:)
840 real(kind=kreal),
intent(inout) :: accim(:)
842 integer(kind=kint) :: imode
848 do imode=1, freqdata%numMode
849 accre(:) = accre(:) - omega**2 * bjre(imode) * freqdata%eigVector(:,imode)
850 accim(:) = accim(:) - omega**2 * bjim(imode) * freqdata%eigVector(:,imode)
855 subroutine setupfreqparam(fstrDYNAMIC, f_start, f_end, numfreq, raym, rayk, idnode, vistype, ioutl)
857 type(fstr_dynamic),
intent(in) :: fstrDYNAMIC
858 real(kind=kreal),
intent(inout) :: f_start
859 real(kind=kreal),
intent(inout) :: f_end
860 integer(kind=kint),
intent(inout) :: numfreq
861 real(kind=kreal),
intent(inout) :: raym
862 real(kind=kreal),
intent(inout) :: rayk
863 integer(kind=kint),
intent(inout) :: idnode
864 integer(kind=kint),
intent(inout) :: vistype
865 integer(kind=kint),
intent(inout) :: ioutl(3)
869 f_start = fstrdynamic%t_start
870 f_end = fstrdynamic%t_end
871 numfreq = fstrdynamic%n_step
872 raym = fstrdynamic%ray_m
873 rayk = fstrdynamic%ray_k
874 idnode = fstrdynamic%nout_monit
875 vistype = fstrdynamic%ngrp_monit
876 ioutl(1:3) = fstrdynamic%iout_list(1:3)
882 type(fstr_freqanalysis_data),
intent(in) :: freqData
883 real(kind=kreal),
intent(in) :: time
884 real(kind=kreal),
intent(in) :: omega
885 real(kind=kreal),
intent(in) :: bjre(:)
886 real(kind=kreal),
intent(in) :: bjim(:)
887 real(kind=kreal),
intent(inout) :: dispre(:)
888 real(kind=kreal),
intent(inout) :: dispim(:)
890 integer(kind=kint) :: imode, idf, s
891 complex(kind=kreal) :: a, b, c
896 a = exp(cmplx(0.0d0, omega*time))
898 do imode=1, freqdata%numMode
899 s =
size(freqdata%eigvector(:,imode))
900 b = cmplx(bjre(imode), bjim(imode)) * a
902 c = b*cmplx(freqdata%eigVector(idf,imode), 0.0d0)
903 dispre(idf) = dispre(idf) + dble(c)
904 dispim(idf) = dispim(idf) + imag(c)
912 type(fstr_freqanalysis_data),
intent(in) :: freqData
913 real(kind=kreal),
intent(in) :: time
914 real(kind=kreal),
intent(in) :: omega
915 real(kind=kreal),
intent(in) :: bjre(:)
916 real(kind=kreal),
intent(in) :: bjim(:)
917 real(kind=kreal),
intent(inout) :: velre(:)
918 real(kind=kreal),
intent(inout) :: velim(:)
920 integer(kind=kint) :: imode, idf, s
921 complex(kind=kreal) :: a, b, c
926 a = cmplx(0.0d0, 1.0d0)*cmplx(omega, 0.0d0)*exp(cmplx(0.0d0, omega*time))
928 do imode=1, freqdata%numMode
929 s =
size(freqdata%eigvector(:,imode))
930 b = cmplx(bjre(imode), bjim(imode)) * a
932 c = b*cmplx(freqdata%eigVector(idf,imode), 0.0d0)
933 velre(idf) = velre(idf) + dble(c)
934 velim(idf) = velim(idf) + imag(c)
942 type(fstr_freqanalysis_data),
intent(in) :: freqData
943 real(kind=kreal),
intent(in) :: time
944 real(kind=kreal),
intent(in) :: omega
945 real(kind=kreal),
intent(in) :: bjre(:)
946 real(kind=kreal),
intent(in) :: bjim(:)
947 real(kind=kreal),
intent(inout) :: accre(:)
948 real(kind=kreal),
intent(inout) :: accim(:)
950 integer(kind=kint) :: imode, idf, s
951 complex(kind=kreal) :: a, b, c
956 a = cmplx(-1.0d0, 0.0d0)*cmplx(omega**2, 0.0d0)*exp(cmplx(0.0d0, omega*time))
958 do imode=1, freqdata%numMode
959 s =
size(freqdata%eigvector(:,imode))
960 b = cmplx(bjre(imode), bjim(imode)) * a
962 c = b*cmplx(freqdata%eigVector(idf,imode), 0.0d0)
963 accre(idf) = accre(idf) + dble(c)
964 accim(idf) = accim(idf) + imag(c)
972 type(fstr_dynamic),
intent(in) :: fstrDYNAMIC
973 real(kind=kreal),
intent(inout) :: t_start
974 real(kind=kreal),
intent(inout) :: t_end
975 real(kind=kreal),
intent(inout) :: dynafreq
976 integer(kind=kint),
intent(inout) :: numdisp
979 t_start = fstrdynamic%gamma
980 t_end = fstrdynamic%beta
981 dynafreq = fstrdynamic%t_delta
982 numdisp = fstrdynamic%nout
988 type(hecmwst_local_mesh),
intent(in) :: hecMESH
989 real(kind=kreal),
intent(in) :: time
990 integer(kind=kint),
intent(in) :: istp
991 real(kind=kreal),
intent(in) :: dispre(:)
992 real(kind=kreal),
intent(in) :: dispim(:)
993 real(kind=kreal),
intent(in) :: velre(:)
994 real(kind=kreal),
intent(in) :: velim(:)
995 real(kind=kreal),
intent(in) :: accre(:)
996 real(kind=kreal),
intent(in) :: accim(:)
997 integer(kind=kint),
intent(in) :: iout(3)
999 integer(kind=kint) :: im, s
1000 character(len=HECMW_HEADER_LEN) :: header
1001 character(len=HECMW_MSG_LEN) :: comment
1002 character(len=HECMW_NAME_LEN) :: label, nameid
1003 real(kind=kreal),
allocatable :: absval(:)
1010 header=
'*fstrresult'
1011 comment=
'frequency_result'
1013 call hecmw_result_init(hecmesh, istp, header, comment)
1017 call hecmw_result_add(hecmw_result_dtype_global, 1, label, absval)
1019 if(iout(1) == 1)
then
1020 label=
'displacement_real'
1021 call hecmw_result_add(hecmw_result_dtype_node, 3, label, dispre)
1022 label=
'displacement_imag'
1023 call hecmw_result_add(hecmw_result_dtype_node, 3, label, dispim)
1024 label=
'displacement_abs'
1025 absval(:) = abs(cmplx(dispre(:), dispim(:)))
1026 call hecmw_result_add(hecmw_result_dtype_node, 3, label, absval)
1029 if(iout(2) == 1)
then
1030 label=
'velocity_real'
1031 call hecmw_result_add(hecmw_result_dtype_node, 3, label, velre)
1032 label=
'velocity_imag'
1033 call hecmw_result_add(hecmw_result_dtype_node, 3, label, velim)
1034 label=
'velocity_abs'
1035 absval(:) = abs(cmplx(velre(:), velim(:)))
1036 call hecmw_result_add(hecmw_result_dtype_node, 3, label, absval)
1039 if(iout(3) == 1)
then
1040 label=
'acceleration_real'
1041 call hecmw_result_add(hecmw_result_dtype_node, 3, label, accre)
1042 label=
'acceleration_imag'
1043 call hecmw_result_add(hecmw_result_dtype_node, 3, label, accim)
1044 label=
'acceleration_abs'
1045 absval(:) = abs(cmplx(velre(:), velim(:)))
1046 call hecmw_result_add(hecmw_result_dtype_node, 3, label, absval)
1049 call hecmw_result_write_by_name(nameid)
1050 call hecmw_result_finalize()
1058 type(hecmwst_local_mesh),
intent(inout) :: hecmesh
1059 integer(kind=kint),
intent(in) :: istp
1060 real(kind=kreal),
intent(in) :: dispre(:)
1061 real(kind=kreal),
intent(in) :: dispim(:)
1062 real(kind=kreal),
intent(in) :: velre(:)
1063 real(kind=kreal),
intent(in) :: velim(:)
1064 real(kind=kreal),
intent(in) :: accre(:)
1065 real(kind=kreal),
intent(in) :: accim(:)
1066 integer(kind=kint),
intent(in) :: iout(3)
1068 type(hecmwst_result_data) :: fstrRESULT
1069 character(len=HECMW_NAME_LEN) :: label
1070 integer(kind=kint) :: s, ncomp, i
1071 real(kind=kreal),
allocatable :: absval(:)
1079 if(iout(i) == 1)
then
1084 call fstr_freq_result_init(hecmesh, ncomp, fstrresult)
1088 if(iout(1) == 1)
then
1089 label =
'displace_real'
1090 call fstr_freq_result_add(fstrresult, hecmesh, ncomp, 3, label, dispre)
1093 label =
'displace_imag'
1094 call fstr_freq_result_add(fstrresult, hecmesh, ncomp, 3, label, dispim)
1097 label =
'displace_abs'
1098 absval(:) = abs(cmplx(dispre(:), dispim(:)))
1099 call fstr_freq_result_add(fstrresult, hecmesh, ncomp, 3, label, absval)
1103 if(iout(2) == 1)
then
1104 label =
'velocity_real'
1105 call fstr_freq_result_add(fstrresult, hecmesh, ncomp, 3, label, velre)
1108 label =
'velocity_imag'
1109 call fstr_freq_result_add(fstrresult, hecmesh, ncomp, 3, label, velim)
1112 label =
'velocity_abs'
1113 absval(:) = abs(cmplx(velre(:), velim(:)))
1114 call fstr_freq_result_add(fstrresult, hecmesh, ncomp, 3, label, absval)
1118 if(iout(3) == 1)
then
1119 label =
'acceleration_real'
1120 call fstr_freq_result_add(fstrresult, hecmesh, ncomp, 3, label, accre)
1123 label =
'acceleration_imag'
1124 call fstr_freq_result_add(fstrresult, hecmesh, ncomp, 3, label, accim)
1127 label =
'acceleration_abs'
1128 absval(:) = abs(cmplx(accre(:), accim(:)))
1129 call fstr_freq_result_add(fstrresult, hecmesh, ncomp, 3, label, absval)
1133 call fstr2hecmw_mesh_conv(hecmesh)
1134 call hecmw_visualize_init
1135 call hecmw_visualize( hecmesh, fstrresult, istp )
1136 call hecmw2fstr_mesh_conv(hecmesh)
1137 call hecmw_result_free(fstrresult)
subroutine nullify_result_data(res)
subroutine free_result_data(res)
subroutine calcdispvector(freqData, bjRe, bjIm, dispRe, dispIm)
subroutine read_eigen_vector(logfile, startmode, endmode, numdof, numnode, eigenvector)
subroutine calcdotproduct(a, b, c)
subroutine output_resfile(hecMESH, freq, ifreq, disp, vel, acc, iout)
subroutine fstr_solve_frequency_analysis(hecMESH, hecMAT, fstrSOLID, fstrEIG, fstrDYNAMIC, fstrRESULT, fstrPARAM, fstrCPL, fstrFREQ, hecLagMAT, restart_step_num)
subroutine read_eigen_vector_res(hecMESH, startmode, endmode, numdof, numnode, eigenvector)
subroutine calcaccvector(freqData, omega, bjRe, bjIm, accRe, accIm)
subroutine extract_surf2node(hecMESH, freqData, numdof, loadvecRe, loadvecIm)
subroutine writeoutvector(im, vector)
subroutine calcdispvectortime(freqData, time, omega, bjRe, bjIm, dispRe, dispIm)
subroutine checkorthvector(fstrEIG, eigenvector, imode, jmode, prod)
subroutine calcfreqcoeff(freqData, loadRe, loadIm, inpOmega, bjRe, bjIm)
subroutine scaleeigenvector(fstrEIG, ntotaldof, nmode, eigenvector)
subroutine output_visfile(hecMESH, ifreq, disp, vel, acc, iout)
subroutine setupdynaparam(fstrDYNAMIC, t_start, t_end, dynafreq, numdisp)
subroutine calcvelvectortime(freqData, time, omega, bjRe, bjIm, velRe, velIm)
subroutine setupfreqparam(fstrDYNAMIC, f_start, f_end, numfreq, raym, rayk, idnode, vistype, ioutl)
subroutine outputdyna_resfile(hecMESH, time, istp, dispre, dispim, velre, velim, accre, accim, iout)
subroutine read_eigen_values(logfile, startmode, endmode, eigenvalue, anglfreq)
subroutine calcmassmatrix(fstrPARAM, hecMESH, hecMAT, fstrSOLID, fstrEIG, hecLagMAT)
subroutine assemble_nodeload(hecMESH, freqData, numdof, loadvecRe, loadvecIm)
subroutine calcaccvectortime(freqData, time, omega, bjRe, bjIm, accRe, accIm)
subroutine outputdyna_visfile(hecMESH, istp, dispre, dispim, velre, velim, accre, accim, iout)
subroutine dl_c3_freq(ETYPE, NN, XX, YY, ZZ, LTYPE, force, VECT, nsize)
subroutine calcvelvector(freqData, omega, bjRe, bjIm, velRe, velIm)
This module contains steady state frequency analysis.
subroutine fstr_freq_result_init(hecMESH, numcomp, fstrRESULT)
subroutine fstr_freq_result_add(fstrRESULT, hecMESH, comp_index, ndof, label, vect)
This module provides a function to deal with prescribed displacement.
Set up lumped mass matrix.
This module provides function to calculate tangent stiffness matrix.
This module defines common data and basic structures for analysis.
integer(kind=kint), pointer iresult
integer(kind=kint), parameter ilog
FILE HANDLER.
integer(kind=kint), pointer ivisual
HECMW to FSTR Mesh Data Converter. Converting Connectivity of Element Type 232, 342 and 352.
Data for coupling analysis.
Data for DYNAMIC ANSLYSIS (fstrDYNAMIC)
Package of data used by Lanczos eigenvalue solver.
FSTR INNER CONTROL PARAMETERS (fstrPARAM)