1# 1 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
7# 1 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 1
8# 1 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 1
9# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
10# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
11# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
12# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
13# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
14# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
16# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
17# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
18# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
20# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
22# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
24# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
26# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
28# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
30# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
32# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
34# 2 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
35# 1 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 1
36# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
37# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
38# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
39# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
40# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
41# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
43# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
44# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
45# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
47# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
49# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
51# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
53# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
55# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
57# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
59# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
61# 2 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 2
63# 4 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
64# 5 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
65# 6 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
66# 7 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
67# 8 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
69# 20 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
71# 43 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
73# 48 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
75# 53 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
77# 58 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
79# 63 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
81# 68 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
83# 76 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
85# 81 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
87# 86 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
89# 91 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
91# 96 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
93# 101 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
95# 106 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
97# 111 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
99# 116 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
101# 121 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
103# 151 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
105# 192 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
107# 207 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
109# 232 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
111# 243 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
113# 245 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
114# 255 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
116# 283 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
118# 293 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
120# 303 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
122# 312 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
124# 329 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
126# 339 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
128# 346 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
130# 352 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
132# 358 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
134# 364 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
136# 370 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
138# 376 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
140# 3 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
141# 1 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 1
142# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
143# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
144# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
145# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
146# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
147# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
149# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
150# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
151# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
153# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
155# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
157# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
159# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
161# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
163# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
165# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
167# 2 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 2
169# 7 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
171# 17 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
173# 22 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
175# 27 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
177# 32 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
179# 37 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
181# 42 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
183# 47 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
185# 52 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
187# 57 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
189# 62 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
191# 73 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
193# 78 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
195# 83 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
197# 88 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
199# 103 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
201# 131 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
203# 160 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
205# 175 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
207# 192 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
209# 213 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
211# 241 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
213# 256 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
215# 266 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
217# 275 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
219# 291 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
221# 301 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
223# 308 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
225# 4 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
227# 21 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
229# 37 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
231# 50 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
233# 104 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
235# 119 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
237# 130 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
239# 143 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
241# 171 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
243# 182 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
245# 193 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
247# 204 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
249# 214 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
251# 225 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
253# 236 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
255# 246 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
257# 252 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
259# 258 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
261# 264 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
263# 270 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
265# 272 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
266# 273 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
268# 2 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 2
270# 14 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
276# 63 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
278# 81 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
280# 88 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
282# 111 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
284# 127 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
286# 153 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
288# 159 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
290# 167 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
292# 7 "/home/runner/work/MFC/MFC/src/common/m_model.fpp" 2
301 use iso_c_binding,
only: c_char, c_int32_t, c_int16_t, c_float
323 real(wp),
allocatable,
dimension(:, :, :, :) ::
gpu_trs_v
330# 43 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
331#if defined(MFC_OpenACC)
332# 43 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
334# 43 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
335#elif defined(MFC_OpenMP)
336# 43 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
338# 43 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
348 character(LEN=*),
intent(in) :: filepath
349 type(
t_model),
intent(out) :: model
351 integer :: i, iunit, iostat
353 character(kind=c_char, len=80) :: header
354 integer(kind=c_int32_t) :: ntriangles
356 real(kind=c_float) :: normal(3), v(3, 3), v_norm
357 integer(kind=c_int16_t) :: attribute
359 open (newunit=iunit, file=filepath, action=
'READ', &
360 form=
'UNFORMATTED', status=
'OLD', iostat=iostat, &
363 if (iostat /= 0)
then
364 print *,
"Error: could not open Binary STL file ", filepath
369 read (iunit, iostat=iostat) header, ntriangles
371 if (iostat /= 0)
then
372 print *,
"Error: could not read header from Binary STL file ", filepath
377 model%ntrs = ntriangles
379 allocate (model%trs(model%ntrs))
382 read (iunit) normal(:), v(1, :), v(2, :), v(3, :), attribute
385 model%trs(i)%n = normal
386 v_norm = sqrt(normal(1)**2 + normal(2)**2 + normal(3)**2)
387 if (v_norm > 0._wp) model%trs(i)%n = normal/v_norm
398 character(LEN=*),
intent(in) :: filepath
399 type(
t_model),
intent(out) :: model
401 integer :: i,
j, iunit, iostat
402 character(80) :: line, buffered_line
403 logical :: is_buffered
404 real(wp) :: normal(3), v_norm
406 is_buffered = .false.
408 open (newunit=iunit, file=filepath, action=
'READ', &
409 form=
'FORMATTED', status=
'OLD', iostat=iostat, &
412 if (iostat /= 0)
then
413 print *,
"Error: could not open ASCII STL file ", filepath
419 if (is_buffered)
then
421 is_buffered = .false.
426 if (line(1:6) ==
"facet ")
then
427 model%ntrs = model%ntrs + 1
431 allocate (model%trs(model%ntrs))
437 if (is_buffered)
then
439 is_buffered = .false.
444 if (line(1:5) ==
"solid") cycle
445 if (line(1:8) ==
"endsolid")
exit
447 if (line(1:12) /=
"facet normal")
then
448 print *,
"Error: expected facet normal in STL file ", filepath
453 read (line(13:), *) normal
454 v_norm = sqrt(normal(1)**2 + normal(2)**2 + normal(3)**2)
455 if (v_norm > 0._wp) model%trs(i)%n = normal/v_norm
458 if (is_buffered)
then
460 is_buffered = .false.
462 read (iunit,
'(A)') line
466 if (is_buffered)
then
468 is_buffered = .false.
473 if (line(1:6) /=
"vertex")
then
474 print *,
"Error: expected vertex in STL file ", filepath
479 read (line(7:), *) model%trs(i)%v(
j, :)
482 if (is_buffered)
then
484 is_buffered = .false.
489 if (is_buffered)
then
491 is_buffered = .false.
496 if (line(1:8) /=
"endfacet")
then
497 print *,
"Error: expected endfacet in STL file ", filepath
510 character(LEN=*),
intent(in) :: filepath
511 type(
t_model),
intent(out) :: model
513 integer :: iunit, iostat
515 character(80) :: line
517 open (newunit=iunit, file=filepath, action=
'READ', &
518 form=
'FORMATTED', status=
'OLD', iostat=iostat, &
521 if (iostat /= 0)
then
522 print *,
"Error: could not open STL file ", filepath
527 read (iunit,
'(A)') line
531 if (line(1:5) ==
"solid")
then
544 character(LEN=*),
intent(in) :: filepath
545 type(
t_model),
intent(out) :: model
547 integer :: i,
j,
k,
l, iunit, iostat, nvertices
549 real(wp),
dimension(1:3),
allocatable :: vertices(:, :)
551 character(80) :: line
553 open (newunit=iunit, file=filepath, action=
'READ', &
554 form=
'FORMATTED', status=
'OLD', iostat=iostat, &
557 if (iostat /= 0)
then
558 print *,
"Error: could not open model file ", filepath
568 select case (line(1:2))
570 nvertices = nvertices + 1
572 model%ntrs = model%ntrs + 1
578 allocate (vertices(nvertices, 1:3))
579 allocate (model%trs(model%ntrs))
587 select case (line(1:2))
593 read (line(3:), *) vertices(i, :)
596 read (line(3:), *)
k,
l,
j
597 model%trs(
j)%v(1, :) = vertices(
k, :)
598 model%trs(
j)%v(2, :) = vertices(
l, :)
599 model%trs(
j)%v(3, :) = vertices(
j, :)
602 print *,
"Error: unknown line type in OBJ file ", filepath
603 print *,
"Line: ", line
609 deallocate (vertices)
620 character(LEN=*),
intent(in) :: filepath
624 select case (filepath(len(trim(filepath)) - 3:len(trim(filepath))))
630 print *,
"Error: unknown model file format for file ", filepath
642 character(LEN=*),
intent(in) :: filepath
643 type(
t_model),
intent(in) :: model
645 integer :: i,
j, iunit, iostat
647 character(kind=c_char, len=80),
parameter :: header =
"Model file written by MFC."
648 integer(kind=c_int32_t) :: ntriangles
649 real(wp) :: normal(3), v(3)
650 integer(kind=c_int16_t) :: attribute
652 open (newunit=iunit, file=filepath, action=
'WRITE', &
653 form=
'UNFORMATTED', iostat=iostat, access=
'STREAM')
655 if (iostat /= 0)
then
656 print *,
"Error: could not open STL file ", filepath
661 ntriangles = model%ntrs
662 write (iunit, iostat=iostat) header, ntriangles
664 if (iostat /= 0)
then
665 print *,
"Error: could not write header to STL file ", filepath
671 normal = model%trs(i)%n
675 v = model%trs(i)%v(
j, :)
680 write (iunit) attribute
692 character(LEN=*),
intent(in) :: filepath
693 type(
t_model),
intent(in) :: model
695 integer :: iunit, iostat
699 open (newunit=iunit, file=filepath, action=
'WRITE', &
700 form=
'FORMATTED', iostat=iostat, access=
'STREAM')
702 if (iostat /= 0)
then
703 print *,
"Error: could not open OBJ file ", filepath
708 write (iunit,
'(A)')
"# Model file written by MFC."
712 write (iunit,
'(A, " ", (f30.20), " ", (f30.20), " ", (f30.20))') &
713 "v", model%trs(i)%v(
j, 1), model%trs(i)%v(
j, 2), model%trs(i)%v(
j, 3)
716 write (iunit,
'(A, " ", I0, " ", I0, " ", I0)') &
717 "f", i*3 - 2, i*3 - 1, i*3
729 character(LEN=*),
intent(in) :: filepath
730 type(
t_model),
intent(in) :: model
732 select case (filepath(len(trim(filepath)) - 3:len(trim(filepath))))
738 print *,
"Error: unknown model file format for file ", filepath
748 type(
t_model),
intent(inout) :: model
750 deallocate (model%trs)
756 integer,
intent(in) :: iunit
757 character(80),
intent(out) :: line
765 read (iunit,
'(A)', iostat=iostat) line
772 line = adjustl(trim(line))
774 if (len(trim(line)) == 0) cycle
775 if (line(1:5) ==
"solid") cycle
776 if (line(1:1) ==
"#") cycle
785 integer,
intent(in) :: iunit
786 character(80),
intent(inout) :: buffered_line
787 logical,
intent(inout) :: is_buffered
789 character(80) :: line
791 if (is_buffered)
then
793 is_buffered = .false.
809 integer,
intent(inout) :: seed
812 seed = ieor(seed, ishft(seed, 13))
813 seed = ieor(seed, ishft(seed, -17))
814 seed = ieor(seed, ishft(seed, 5))
816 rval = abs(real(seed, wp))/real(huge(seed), wp)
829 type(
t_model),
intent(in) :: model
830 real(wp),
dimension(1:3),
intent(in) :: point
831 real(wp),
dimension(1:3),
intent(in) :: spacing
832 integer,
intent(in) :: spc
833 real(wp) :: phi, theta
839 integer :: i,
j,
k, ninorout, nhits
841 real(wp),
dimension(1:spc, 1:3) :: ray_origins, ray_dirs
843 rand_seed = int(point(1)*73856093._wp) + &
844 int(point(2)*19349663._wp) + &
845 int(point(3)*83492791._wp)
846 if (rand_seed == 0) rand_seed = 1
856 ray_dirs(i, :) = ray_dirs(i, :)/sqrt(sum(ray_dirs(i, :)*ray_dirs(i, :)))
862 ray%o = ray_origins(i, :)
863 ray%d = ray_dirs(i, :)
875 ninorout = ninorout + mod(nhits, 2)
878 fraction = real(ninorout)/real(spc)
890# 593 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
892# 593 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
894# 593 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
896# 593 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
898# 593 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
900# 593 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
902# 593 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
905 integer,
intent(in) :: ntrs
906 integer,
intent(in) :: pid
907 real(wp),
dimension(1:3),
intent(in) :: point
912 integer :: i,
j,
k, q, ninorout, nhits
919 if (i /= 0 .or.
j /= 0 .or.
k /= 0)
then
921 if (p == 0 .and.
k == 0) cycle
925 ray%d(:) = [real(i, wp), real(
j, wp), real(
k, wp)]
926 ray%d = ray%d/sqrt(real(abs(i) + abs(
j) + abs(
k), wp))
936 ninorout = ninorout + mod(nhits, 2)
944 fraction = real(ninorout)/18._wp
946 fraction = real(ninorout)/26._wp
959# 648 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
961# 648 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
963# 648 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
965# 648 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
967# 648 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
969# 648 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
971# 648 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
974 type(
t_ray),
intent(in) :: ray
977 integer :: intersects
979 real(wp) :: n(3), p(3), c(3), edge(3), vp(3)
980 real(wp) :: d, t, ndotraydirection
984 n(1:3) = triangle%n(1:3)
985 ndotraydirection = dot_product(n(1:3), ray%d(1:3))
986 if (abs(ndotraydirection) < 0.0000001_wp)
then
990 d = -sum(n(:)*triangle%v(1, :))
991 t = -(sum(n(:)*ray%o(:)) + d)/ndotraydirection
997 edge = triangle%v(2, :) - triangle%v(1, :)
998 vp = p - triangle%v(1, :)
1000 if (sum(n(:)*c(:)) < 0)
then
1004 edge = triangle%v(3, :) - triangle%v(2, :)
1005 vp = p - triangle%v(2, :)
1007 if (sum(n(:)*c(:)) < 0)
then
1011 edge = triangle%v(1, :) - triangle%v(3, :)
1012 vp = p - triangle%v(3, :)
1014 if (sum(n(:)*c(:)) < 0)
then
1027 type(
t_model),
intent(in) :: model
1028 real(wp),
allocatable,
intent(out),
dimension(:, :, :) :: boundary_v
1029 integer,
intent(out) :: boundary_vertex_count, boundary_edge_count
1032 integer :: edge_count, edge_index, store_index
1033 real(wp),
dimension(1:2, 1:2) :: edge
1034 real(wp),
dimension(1:2) :: boundary_edge
1035 real(wp),
dimension(1:(3*model%ntrs), 1:2, 1:2) :: temp_boundary_v
1036 integer,
dimension(1:(3*model%ntrs)) :: edge_occurrence
1037 real(wp) :: edgetan, initial, v_norm, xnormal, ynormal
1040 edge_count = 3*model%ntrs
1047 do i = 1, model%ntrs
1049 edge(1, 1:2) = model%trs(i)%v(1, 1:2)
1050 edge(2, 1:2) = model%trs(i)%v(2, 1:2)
1054 edge(1, 1:2) = model%trs(i)%v(2, 1:2)
1055 edge(2, 1:2) = model%trs(i)%v(3, 1:2)
1059 edge(1, 1:2) = model%trs(i)%v(3, 1:2)
1060 edge(2, 1:2) = model%trs(i)%v(1, 1:2)
1066# 741 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1068# 741 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1069#if defined(MFC_OpenACC)
1070# 741 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1072# 741 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1073#elif defined(MFC_OpenMP)
1074# 741 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1076# 741 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1078# 741 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1080# 741 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1082# 741 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1084# 741 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1086 do i = 1, edge_count
1087 do j = 1, edge_count
1089 if (((abs(temp_boundary_v(i, 1, 1) - temp_boundary_v(
j, 1, 1)) < threshold_edge_zero) .and. &
1090 (abs(temp_boundary_v(i, 1, 2) - temp_boundary_v(
j, 1, 2)) < threshold_edge_zero) .and. &
1091 (abs(temp_boundary_v(i, 2, 1) - temp_boundary_v(
j, 2, 1)) < threshold_edge_zero) .and. &
1092 (abs(temp_boundary_v(i, 2, 2) - temp_boundary_v(
j, 2, 2)) < threshold_edge_zero)) .or. &
1093 ((abs(temp_boundary_v(i, 1, 1) - temp_boundary_v(
j, 2, 1)) < threshold_edge_zero) .and. &
1094 (abs(temp_boundary_v(i, 1, 2) - temp_boundary_v(
j, 2, 2)) < threshold_edge_zero) .and. &
1095 (abs(temp_boundary_v(i, 2, 1) - temp_boundary_v(
j, 1, 1)) < threshold_edge_zero) .and. &
1096 (abs(temp_boundary_v(i, 2, 2) - temp_boundary_v(
j, 1, 2)) < threshold_edge_zero)))
then
1099# 754 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1100#if defined(MFC_OpenACC)
1101# 754 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1103# 754 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1104#elif defined(MFC_OpenMP)
1105# 754 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1107# 754 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1109 edge_occurrence(i) = edge_occurrence(i) + 1
1115# 760 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1117# 760 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1118#if defined(MFC_OpenACC)
1119# 760 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1121# 760 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1122#elif defined(MFC_OpenMP)
1123# 760 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1125# 760 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1127# 760 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1129# 760 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1131# 760 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1135 boundary_vertex_count = 0
1136 boundary_edge_count = 0
1138 do i = 1, edge_count
1139 if (edge_occurrence(i) == 0)
then
1140 boundary_vertex_count = boundary_vertex_count + 2
1141 boundary_edge_count = boundary_edge_count + 1
1146 allocate (boundary_v(boundary_edge_count, 1:3, 1:2))
1150 do i = 1, edge_count
1151 if (edge_occurrence(i) == 0)
then
1152 store_index = store_index + 1
1153 boundary_v(store_index, 1, 1:2) = temp_boundary_v(i, 1, 1:2)
1154 boundary_v(store_index, 2, 1:2) = temp_boundary_v(i, 2, 1:2)
1159 do i = 1, boundary_edge_count
1160 boundary_edge(1) = boundary_v(i, 2, 1) - boundary_v(i, 1, 1)
1161 boundary_edge(2) = boundary_v(i, 2, 2) - boundary_v(i, 1, 2)
1162 edgetan = boundary_edge(1)/sign(max(sgm_eps, abs(boundary_edge(2))), boundary_edge(2))
1164 if (abs(boundary_edge(2)) < threshold_vector_zero)
then
1165 if (edgetan > 0._wp)
then
1173 initial = boundary_edge(2)
1174 ynormal = -edgetan*initial
1178 v_norm = sqrt(xnormal**2 + ynormal**2)
1179 boundary_v(i, 3, 1) = xnormal/v_norm
1180 boundary_v(i, 3, 2) = ynormal/v_norm
1188 integer,
intent(inout) :: edge_index
1189 integer,
intent(inout) :: edge_count
1190 real(wp),
intent(in),
dimension(1:2, 1:2) :: edge
1191 real(wp),
dimension(1:edge_count, 1:2, 1:2),
intent(inout) :: temp_boundary_v
1194 edge_index = edge_index + 1
1195 temp_boundary_v(edge_index, 1, 1:2) = edge(1, 1:2)
1196 temp_boundary_v(edge_index, 2, 1:2) = edge(2, 1:2)
1211# 838 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1213# 838 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1215# 838 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1217# 838 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1219# 838 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1221# 838 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1223# 838 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1226 integer,
intent(in) :: ntrs
1227 integer,
intent(in) :: pid
1228 real(wp),
dimension(1:3),
intent(in) :: point
1229 real(wp),
dimension(1:3),
intent(out) :: normals
1230 real(wp),
intent(out) :: distance
1233 real(wp) :: dist_min, dist_proj, dist_v, dist_e, t
1234 real(wp) :: v1(1:3), v2(1:3), v3(1:3)
1235 real(wp) :: e0(1:3), e1(1:3), pv(1:3)
1236 real(wp) :: n(1:3), proj(1:3), norm_vec(1:3)
1237 real(wp) :: d, ndot, denom, norm_mag
1238 real(wp) :: u, v_bary, w
1239 real(wp) :: l00, l01, l11, l20, l21
1240 real(wp) :: edge(1:3), pe(1:3)
1241 real(wp) :: verts(1:3, 1:3)
1243 dist_min = initial_distance_buffer
1256 pv(:) = point(:) - v1(:)
1257 d = dot_product(pv, n)
1258 if (abs(d) >= dist_min) cycle
1259 proj(:) = point(:) - d*n(:)
1262 e0(:) = v2(:) - v1(:)
1263 e1(:) = v3(:) - v1(:)
1264 pv(:) = proj(:) - v1(:)
1266 l00 = dot_product(e0, e0)
1267 l01 = dot_product(e0, e1)
1268 l11 = dot_product(e1, e1)
1269 l20 = dot_product(pv, e0)
1270 l21 = dot_product(pv, e1)
1272 denom = l00*l11 - l01*l01
1275 if (abs(denom) > 0._wp)
then
1276 v_bary = (l11*l20 - l01*l21)/denom
1277 w = (l00*l21 - l01*l20)/denom
1278 u = 1._wp - v_bary - w
1286 if (u >= 0._wp .and. v_bary >= 0._wp .and. w >= 0._wp)
then
1287 dist_proj = sqrt((point(1) - proj(1))**2 + &
1288 (point(2) - proj(2))**2 + &
1289 (point(3) - proj(3))**2)
1291 if (dist_proj < dist_min)
then
1292 dist_min = dist_proj
1303 edge(:) = verts(:, mod(
j, 3) + 1) - verts(:,
j)
1304 pe(:) = point(:) - verts(:,
j)
1306 t = dot_product(pe, edge)/max(dot_product(edge, edge), 1.e-30_wp)
1308 if (t >= 0._wp .and. t <= 1._wp)
then
1309 proj(:) = verts(:,
j) + t*edge(:)
1310 dist_e = sqrt((point(1) - proj(1))**2 + &
1311 (point(2) - proj(2))**2 + &
1312 (point(3) - proj(3))**2)
1314 if (dist_e < dist_min)
then
1316 norm_vec(:) = proj(:) - point(:)
1317 if (dist_e > 0._wp) norm_vec = norm_vec/dist_e
1319 if (f_approx_equal(dot_product(norm_vec, n), 1._wp))
then
1322 normals(:) = norm_vec(:)
1325 else if (t < 0._wp)
then
1326 dist_v = sqrt((point(1) - verts(1,
j))**2 + &
1327 (point(2) - verts(2,
j))**2 + &
1328 (point(3) - verts(3,
j))**2)
1330 if (dist_v < dist_min)
then
1332 norm_vec(:) = verts(:,
j) - point(:)
1333 norm_mag = sqrt(dot_product(norm_vec, norm_vec))
1334 if (norm_mag > 0._wp) norm_vec = norm_vec/norm_mag
1335 normals(:) = norm_vec(:)
1338 dist_v = sqrt((point(1) - verts(1, mod(
j, 3) + 1))**2 + &
1339 (point(2) - verts(2, mod(
j, 3) + 1))**2 + &
1340 (point(3) - verts(3, mod(
j, 3) + 1))**2)
1342 if (dist_v < dist_min)
then
1344 norm_vec(:) = verts(:, mod(
j, 3) + 1) - point(:)
1345 norm_mag = sqrt(dot_product(norm_vec, norm_vec))
1346 if (norm_mag > 0._wp) norm_vec = norm_vec/norm_mag
1347 normals(:) = norm_vec(:)
1368# 981 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1370# 981 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1372# 981 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1374# 981 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1376# 981 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1378# 981 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1380# 981 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1383 integer,
intent(in) :: pid
1384 integer,
intent(in) :: boundary_edge_count
1385 real(wp),
dimension(1:3),
intent(in) :: point
1386 real(wp),
dimension(1:3),
intent(out) :: normals
1387 real(wp),
intent(out) :: distance
1390 real(wp) :: dist_min, dist, t, norm_mag
1391 real(wp) :: v1(1:2), v2(1:2), edge(1:2), pv(1:2)
1392 real(wp) :: edge_len_sq, proj(1:2), norm(1:2), c
1394 dist_min = initial_distance_buffer
1398 do i = 1, boundary_edge_count
1407 pv(1) = point(1) - v1(1)
1408 pv(2) = point(2) - v1(2)
1409 edge_len_sq = dot_product(edge, edge)
1412 if (edge_len_sq > 0._wp)
then
1413 t = dot_product(pv, edge)/edge_len_sq
1419 if (t >= 0._wp .and. t <= 1._wp)
then
1421 dist = sqrt((point(1) - proj(1))**2 + (point(2) - proj(2))**2)
1424 else if (t < 0._wp)
then
1425 dist = sqrt((point(1) - v1(1))**2 + (point(2) - v1(2))**2)
1426 norm(1) = v1(1) - point(1)
1427 norm(2) = v1(2) - point(2)
1430 dist = sqrt((point(1) - v2(1))**2 + (point(2) - v2(2))**2)
1431 norm(1) = v2(1) - point(1)
1432 norm(2) = v2(2) - point(2)
1436 if (dist < dist_min)
then
1438 normals(1) = norm(1)
1439 normals(2) = norm(2)
1447#ifdef MFC_SIMULATION
1452 real(wp) :: normals(1:3)
1453 integer :: boundary_vertex_count, boundary_edge_count, total_vertices
1454 real(wp),
allocatable,
dimension(:, :, :) :: boundary_v
1455 real(wp) :: dx_local, dy_local, dz_local
1460 type(
t_bbox) :: bbox, bbox_old
1465 real(wp),
dimension(1:3) :: point, model_center
1466 real(wp) :: grid_mm(1:3, 1:2)
1468 real(wp),
dimension(1:4, 1:4) :: transform, transform_n
1470 dx_local = minval(dx); dy_local = minval(dy)
1471 if (p /= 0) dz_local = minval(dz)
1475 do patch_id = 1, num_ibs
1476 if (patch_ib(patch_id)%geometry == 5 .or. patch_ib(patch_id)%geometry == 12)
then
1477 allocate (
models(patch_id)%model)
1478 print *,
" * Reading model: "//trim(patch_ib(patch_id)%model_filepath)
1480 model =
f_model_read(patch_ib(patch_id)%model_filepath)
1481 params%scale(:) = patch_ib(patch_id)%model_scale(:)
1482 params%translate(:) = patch_ib(patch_id)%model_translate(:)
1483 params%rotate(:) = patch_ib(patch_id)%model_rotate(:)
1484 params%spc = patch_ib(patch_id)%model_spc
1485 params%threshold = patch_ib(patch_id)%model_threshold
1487 if (f_approx_equal(dot_product(params%scale, params%scale), 0._wp))
then
1488 params%scale(:) = 1._wp
1491 if (proc_rank == 0)
then
1492 print *,
" * Transforming model."
1497 model_center(1:3) = (bbox_old%min(1:3) + bbox_old%max(1:3))/2._wp
1509 if (proc_rank == 0)
then
1510 print *,
' * Number of input model vertices:', 3*model%ntrs
1514 if (p == 0)
call s_check_boundary(model, boundary_v, boundary_vertex_count, boundary_edge_count)
1517 if (proc_rank == 0 .and. p == 0)
then
1518 print *,
' * Number of 2D model boundary edges:', boundary_edge_count
1521 if (proc_rank == 0)
then
1522 write (*,
"(A, 3(2X, F20.10))")
" > Model: Min:", bbox%min(1:3)
1523 write (*,
"(A, 3(2X, F20.10))")
" > Cen:", (bbox%min(1:3) + bbox%max(1:3))/2._wp
1524 write (*,
"(A, 3(2X, F20.10))")
" > Max:", bbox%max(1:3)
1526 grid_mm(1, :) = (/minval(x_cc(0:m)) - 0.5_wp*dx_local, maxval(x_cc(0:m)) + 0.5_wp*dx_local/)
1527 grid_mm(2, :) = (/minval(y_cc(0:n)) - 0.5_wp*dy_local, maxval(y_cc(0:n)) + 0.5_wp*dy_local/)
1530 grid_mm(3, :) = (/minval(z_cc(0:p)) - 0.5_wp*dz_local, maxval(z_cc(0:p)) + 0.5_wp*dz_local/)
1532 grid_mm(3, :) = (/0._wp, 0._wp/)
1535 write (*,
"(A, 3(2X, F20.10))")
" > Domain: Min:", grid_mm(:, 1)
1536 write (*,
"(A, 3(2X, F20.10))")
" > Cen:", (grid_mm(:, 1) + grid_mm(:, 2))/2._wp
1537 write (*,
"(A, 3(2X, F20.10))")
" > Max:", grid_mm(:, 2)
1540 stl_bounding_boxes(patch_id, 1, 1:3) = [bbox%min(1), (bbox%min(1) + bbox%max(1))/2._wp, bbox%max(1)]
1541 stl_bounding_boxes(patch_id, 2, 1:3) = [bbox%min(2), (bbox%min(2) + bbox%max(2))/2._wp, bbox%max(2)]
1542 stl_bounding_boxes(patch_id, 3, 1:3) = [bbox%min(3), (bbox%min(3) + bbox%max(3))/2._wp, bbox%max(3)]
1544 models(patch_id)%model = model
1546 models(patch_id)%boundary_v = boundary_v
1547 models(patch_id)%boundary_edge_count = boundary_edge_count
1554 integer :: pid, max_ntrs
1555 integer :: max_bv1, max_bv2, max_bv3, max_iv1, max_iv2
1558 max_bv1 = 0; max_bv2 = 0; max_bv3 = 0
1559 max_iv1 = 0; max_iv2 = 0
1562 if (
allocated(
models(pid)%model))
then
1564 max_ntrs = max(max_ntrs,
models(pid)%ntrs)
1566 if (
allocated(
models(pid)%boundary_v))
then
1567 max_bv1 = max(max_bv1,
size(
models(pid)%boundary_v, 1))
1568 max_bv2 = max(max_bv2,
size(
models(pid)%boundary_v, 2))
1569 max_bv3 = max(max_bv3,
size(
models(pid)%boundary_v, 3))
1573 if (max_ntrs > 0)
then
1575# 1174 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1577# 1174 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1578 use iso_fortran_env,
only: output_unit
1579# 1174 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1581# 1174 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1582 print *,
'm_model.fpp:1174: ',
'@:ALLOCATE(gpu_ntrs(1:num_ibs))'
1583# 1174 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1585# 1174 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1586 call flush (output_unit)
1587# 1174 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1589# 1174 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1591# 1174 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1593# 1174 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1595# 1174 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1597# 1174 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1598#if defined(MFC_OpenACC)
1599# 1174 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1601# 1174 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1602#elif defined(MFC_OpenMP)
1603# 1174 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1605# 1174 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1608# 1175 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1610# 1175 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1611 use iso_fortran_env,
only: output_unit
1612# 1175 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1614# 1175 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1615 print *,
'm_model.fpp:1175: ',
'@:ALLOCATE(gpu_trs_v(1:3, 1:3, 1:max_ntrs, 1:num_ibs))'
1616# 1175 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1618# 1175 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1619 call flush (output_unit)
1620# 1175 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1622# 1175 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1624# 1175 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1625 allocate (
gpu_trs_v(1:3, 1:3, 1:max_ntrs, 1:num_ibs))
1626# 1175 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1628# 1175 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1630# 1175 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1631#if defined(MFC_OpenACC)
1632# 1175 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1634# 1175 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1635#elif defined(MFC_OpenMP)
1636# 1175 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1638# 1175 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1641# 1176 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1643# 1176 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1644 use iso_fortran_env,
only: output_unit
1645# 1176 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1647# 1176 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1648 print *,
'm_model.fpp:1176: ',
'@:ALLOCATE(gpu_trs_n(1:3, 1:max_ntrs, 1:num_ibs))'
1649# 1176 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1651# 1176 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1652 call flush (output_unit)
1653# 1176 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1655# 1176 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1657# 1176 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1658 allocate (
gpu_trs_n(1:3, 1:max_ntrs, 1:num_ibs))
1659# 1176 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1661# 1176 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1663# 1176 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1664#if defined(MFC_OpenACC)
1665# 1176 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1667# 1176 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1668#elif defined(MFC_OpenMP)
1669# 1176 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1671# 1176 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1674# 1177 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1676# 1177 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1677 use iso_fortran_env,
only: output_unit
1678# 1177 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1680# 1177 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1681 print *,
'm_model.fpp:1177: ',
'@:ALLOCATE(gpu_boundary_edge_count(1:num_ibs))'
1682# 1177 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1684# 1177 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1685 call flush (output_unit)
1686# 1177 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1688# 1177 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1690# 1177 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1692# 1177 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1694# 1177 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1696# 1177 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1697#if defined(MFC_OpenACC)
1698# 1177 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1700# 1177 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1701#elif defined(MFC_OpenMP)
1702# 1177 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1704# 1177 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1707# 1178 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1709# 1178 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1710 use iso_fortran_env,
only: output_unit
1711# 1178 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1713# 1178 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1714 print *,
'm_model.fpp:1178: ',
'@:ALLOCATE(gpu_total_vertices(1:num_ibs))'
1715# 1178 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1717# 1178 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1718 call flush (output_unit)
1719# 1178 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1721# 1178 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1723# 1178 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1725# 1178 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1727# 1178 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1729# 1178 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1730#if defined(MFC_OpenACC)
1731# 1178 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1733# 1178 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1734#elif defined(MFC_OpenMP)
1735# 1178 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1737# 1178 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1746 if (max_bv1 > 0)
then
1748# 1187 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1750# 1187 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1751 use iso_fortran_env,
only: output_unit
1752# 1187 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1754# 1187 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1755 print *,
'm_model.fpp:1187: ',
'@:ALLOCATE(gpu_boundary_v(1:max_bv1, 1:max_bv2, 1:max_bv3, 1:num_ibs))'
1756# 1187 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1758# 1187 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1759 call flush (output_unit)
1760# 1187 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1762# 1187 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1764# 1187 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1765 allocate (
gpu_boundary_v(1:max_bv1, 1:max_bv2, 1:max_bv3, 1:num_ibs))
1766# 1187 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1768# 1187 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1770# 1187 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1771#if defined(MFC_OpenACC)
1772# 1187 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1774# 1187 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1775#elif defined(MFC_OpenMP)
1776# 1187 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1778# 1187 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1784 if (
allocated(
models(pid)%model))
then
1791 if (
allocated(
models(pid)%boundary_v) .and. p == 0)
then
1793 1:
size(
models(pid)%boundary_v, 2), &
1794 1:
size(
models(pid)%boundary_v, 3), pid) =
models(pid)%boundary_v
1799# 1206 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1800#if defined(MFC_OpenACC)
1801# 1206 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1803# 1206 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1804#elif defined(MFC_OpenMP)
1805# 1206 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1807# 1206 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1811# 1208 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1812#if defined(MFC_OpenACC)
1813# 1208 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1815# 1208 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1816#elif defined(MFC_OpenMP)
1817# 1208 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1819# 1208 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1830 type(t_model_array),
intent(inout) :: ma
1833 ma%ntrs = ma%model%ntrs
1834 allocate (ma%trs_v(1:3, 1:3, 1:ma%ntrs))
1835 allocate (ma%trs_n(1:3, 1:ma%ntrs))
1838 ma%trs_v(:, :, i) = ma%model%trs(i)%v(:, :)
1839 ma%trs_n(:, i) = ma%model%trs(i)%n(:)
Shared derived types for field data, patch geometry, bubble dynamics, and MPI I/O structures.
Utility routines for bubble model setup, coordinate transforms, array sampling, and special functions...
subroutine, public s_transform_model(model, matrix, matrix_n)
This procedure transforms a model by a matrix, one triangle at a time.
type(t_bbox) function, public f_create_bbox(model)
This procedure creates a bounding box for a model.
pure real(wp) function, dimension(3), public f_cross(a, b)
This procedure computes the cross product of two vectors.
real(wp) function, dimension(1:4, 1:4), public f_create_transform_matrix(param, center)
This procedure creates a transformation matrix.
Binary STL file reader and processor for immersed boundary geometry.
impure subroutine, public s_model_write(filepath, model)
This procedure writes a binary STL file.
impure subroutine s_write_stl(filepath, model)
This procedure writes a binary STL file.
integer function f_intersects_triangle(ray, triangle)
This procedure checks if a ray intersects a triangle.
impure logical function f_read_line(iunit, line)
integer, dimension(:), allocatable, public gpu_total_vertices
impure subroutine s_read_obj(filepath, model)
This procedure reads an OBJ file.
impure real(wp) function, public f_model_is_inside(model, point, spacing, spc)
This procedure, recursively, finds whether a point is inside an octree.
real(wp), dimension(:, :, :, :), allocatable, public gpu_trs_v
real(wp) function, public f_model_is_inside_flat(ntrs, pid, point)
This procedure, given a cell center will determine if a point exists instide a surface.
subroutine, public s_distance_normals_2d(pid, boundary_edge_count, point, normals, distance)
This procedure determines the levelset distance and normals of 2D models by computing the exact close...
impure subroutine s_skip_ignored_lines(iunit, buffered_line, is_buffered)
Reads the next non-comment line from a model file, using a buffered look-ahead mechanism.
subroutine, public s_model_free(model)
This procedure frees the memory allocated for an STL mesh.
integer, dimension(:), allocatable, public gpu_ntrs
subroutine, public s_register_edge(temp_boundary_v, edge, edge_index, edge_count)
This procedure appends the edge end vertices to a temporary buffer.
impure subroutine s_read_stl(filepath, model)
This procedure reads an STL file.
impure type(t_model) function, public f_model_read(filepath)
This procedure reads a mesh from a file.
real(wp), dimension(:, :, :, :), allocatable, public gpu_boundary_v
subroutine, public s_check_boundary(model, boundary_v, boundary_vertex_count, boundary_edge_count)
This procedure checks and labels edges shared by two or more triangles facets of the 2D STL model.
subroutine, public s_distance_normals_3d(ntrs, pid, point, normals, distance)
This procedure determines the levelset distance and normals of 3D models by computing the exact close...
type(t_model_array), dimension(:), allocatable, target, public models
impure subroutine s_write_obj(filepath, model)
This procedure writes an OBJ file.
real(wp), dimension(:, :, :), allocatable, public gpu_trs_n
real(wp), dimension(:, :, :), allocatable, public stl_bounding_boxes
impure subroutine s_read_stl_ascii(filepath, model)
This procedure reads an ASCII STL file.
impure subroutine s_read_stl_binary(filepath, model)
This procedure reads a binary STL file.
subroutine, public s_instantiate_stl_models()
subroutine, public s_pack_model_for_gpu(ma)
integer, dimension(:), allocatable, public gpu_boundary_edge_count
real(wp) function f_model_random_number(seed)
This function is used to replace the fortran random number generator because the native generator is ...
MPI halo exchange, domain decomposition, and buffer packing/unpacking for the simulation solver.
Defines parameters for a Model Patch.