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# 12 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
21# 1 "/home/runner/work/MFC/MFC/src/common/include/defaults/thermochem.fpp" 1
24# 4 "/home/runner/work/MFC/MFC/src/common/include/defaults/thermochem.fpp"
25# 5 "/home/runner/work/MFC/MFC/src/common/include/defaults/thermochem.fpp"
26# 13 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 2
28# 16 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
29# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
31# 24 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
33# 53 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
35# 65 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
37# 75 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
39# 105 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
41# 117 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
43# 127 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
45# 174 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
47# 2 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
48# 1 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 1
49# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
50# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
51# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
52# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
53# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
54# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
56# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
57# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
58# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
60# 12 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
61# 1 "/home/runner/work/MFC/MFC/src/common/include/defaults/thermochem.fpp" 1
64# 4 "/home/runner/work/MFC/MFC/src/common/include/defaults/thermochem.fpp"
65# 5 "/home/runner/work/MFC/MFC/src/common/include/defaults/thermochem.fpp"
66# 13 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 2
68# 16 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
69# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
71# 24 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
73# 53 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
75# 65 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
77# 75 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
79# 105 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
81# 117 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
83# 127 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
85# 174 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
87# 2 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 2
89# 4 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
90# 5 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
91# 6 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
92# 7 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
93# 8 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
95# 20 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
97# 43 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
99# 48 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
101# 53 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
103# 58 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
105# 63 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
107# 68 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
109# 81 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
111# 95 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
113# 100 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
115# 105 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
117# 110 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
119# 115 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
121# 120 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
123# 125 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
125# 130 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
127# 135 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
129# 165 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
131# 219 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
133# 233 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
135# 258 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
137# 269 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
139# 271 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
140# 282 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
142# 332 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
144# 342 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
146# 352 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
148# 361 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
150# 378 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
152# 388 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
154# 395 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
156# 401 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
158# 407 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
160# 413 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
162# 419 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
164# 425 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
166# 3 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
167# 1 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 1
168# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
169# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
170# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
171# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
172# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
173# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
175# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
176# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
177# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
179# 12 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
180# 1 "/home/runner/work/MFC/MFC/src/common/include/defaults/thermochem.fpp" 1
183# 4 "/home/runner/work/MFC/MFC/src/common/include/defaults/thermochem.fpp"
184# 5 "/home/runner/work/MFC/MFC/src/common/include/defaults/thermochem.fpp"
185# 13 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 2
187# 16 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
188# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
190# 24 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
192# 53 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
194# 65 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
196# 75 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
198# 105 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
200# 117 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
202# 127 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
204# 174 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
206# 2 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 2
208# 7 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
210# 17 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
212# 22 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
214# 27 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
216# 32 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
218# 37 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
220# 42 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
222# 47 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
224# 52 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
226# 57 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
228# 62 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
230# 73 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
232# 78 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
234# 83 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
236# 88 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
238# 103 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
240# 131 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
242# 160 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
244# 175 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
246# 193 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
248# 215 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
250# 244 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
252# 259 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
254# 269 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
256# 278 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
258# 294 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
260# 304 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
262# 311 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
264# 4 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
267# 23 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
270# 43 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
273# 55 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
276# 112 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
279# 130 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
282# 145 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
285# 164 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
288# 193 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
291# 207 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
294# 219 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
297# 231 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
300# 242 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
303# 254 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
306# 266 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
309# 275 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
312# 282 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
315# 289 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
318# 296 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
321# 303 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
323# 305 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
324# 306 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
326# 2 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 2
328# 14 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
333# 52 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
336# 72 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
339# 80 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
342# 104 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
345# 120 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
348# 145 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
350# 151 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
352# 158 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
354# 7 "/home/runner/work/MFC/MFC/src/common/m_model.fpp" 2
362 use iso_c_binding,
only: c_char, c_int32_t, c_int16_t, c_float
385# 36 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
386#if defined(MFC_OpenACC)
387# 36 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
389# 36 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
390#elif defined(MFC_OpenMP)
391# 36 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
393# 36 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
395# 37 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
402 character(LEN=*),
intent(in) :: filepath
403 type(
t_model),
intent(out) :: model
404 integer :: i, iunit, iostat
405 character(kind=c_char, len=80) :: header
406 integer(kind=c_int32_t) :: ntriangles
407 real(kind=c_float) :: normal(3), v(3, 3), v_norm
408 integer(kind=c_int16_t) :: attribute
410 open (newunit=iunit, file=filepath, action=
'READ', form=
'UNFORMATTED', status=
'OLD', iostat=iostat, access=
'STREAM')
412 if (iostat /= 0)
then
413 print *,
"Error: could not open Binary STL file ", filepath
418 read (iunit, iostat=iostat) header, ntriangles
420 if (iostat /= 0)
then
421 print *,
"Error: could not read header from Binary STL file ", filepath
426 model%ntrs = ntriangles
428 allocate (model%trs(model%ntrs))
431 read (iunit) normal(:), v(1,:), v(2,:), v(3,:), attribute
434 model%trs(i)%n = normal
435 v_norm = sqrt(normal(1)**2 + normal(2)**2 + normal(3)**2)
436 if (v_norm > 0._wp) model%trs(i)%n = normal/v_norm
446 character(LEN=*),
intent(in) :: filepath
447 type(
t_model),
intent(out) :: model
448 integer :: i,
j, iunit, iostat
449 character(80) :: line, buffered_line
450 logical :: is_buffered
451 real(wp) :: normal(3), v_norm
453 is_buffered = .false.
455 open (newunit=iunit, file=filepath, action=
'READ', form=
'FORMATTED', status=
'OLD', iostat=iostat, access=
'STREAM')
457 if (iostat /= 0)
then
458 print *,
"Error: could not open ASCII STL file ", filepath
464 if (is_buffered)
then
466 is_buffered = .false.
471 if (line(1:6) ==
"facet ")
then
472 model%ntrs = model%ntrs + 1
476 allocate (model%trs(model%ntrs))
482 if (is_buffered)
then
484 is_buffered = .false.
489 if (line(1:5) ==
"solid") cycle
490 if (line(1:8) ==
"endsolid")
exit
492 if (line(1:12) /=
"facet normal")
then
493 print *,
"Error: expected facet normal in STL file ", filepath
498 read (line(13:), *) normal
499 v_norm = sqrt(normal(1)**2 + normal(2)**2 + normal(3)**2)
500 if (v_norm > 0._wp) model%trs(i)%n = normal/v_norm
503 if (is_buffered)
then
505 is_buffered = .false.
507 read (iunit,
'(A)') line
511 if (is_buffered)
then
513 is_buffered = .false.
518 if (line(1:6) /=
"vertex")
then
519 print *,
"Error: expected vertex in STL file ", filepath
524 read (line(7:), *) model%trs(i)%v(
j,:)
527 if (is_buffered)
then
529 is_buffered = .false.
534 if (is_buffered)
then
536 is_buffered = .false.
541 if (line(1:8) /=
"endfacet")
then
542 print *,
"Error: expected endfacet in STL file ", filepath
554 character(LEN=*),
intent(in) :: filepath
555 type(
t_model),
intent(out) :: model
556 integer :: iunit, iostat
557 character(80) :: line
559 open (newunit=iunit, file=filepath, action=
'READ', form=
'FORMATTED', status=
'OLD', iostat=iostat, access=
'STREAM')
561 if (iostat /= 0)
then
562 print *,
"Error: could not open STL file ", filepath
567 read (iunit,
'(A)') line
571 if (line(1:5) ==
"solid")
then
582 character(LEN=*),
intent(in) :: filepath
583 type(
t_model),
intent(out) :: model
584 integer :: i,
j,
k,
l, iv3, iunit, iostat, nvertices
585 real(wp),
dimension(1:3),
allocatable :: vertices(:,:)
586 character(80) :: line
588 open (newunit=iunit, file=filepath, action=
'READ', form=
'FORMATTED', status=
'OLD', iostat=iostat, access=
'STREAM')
590 if (iostat /= 0)
then
591 print *,
"Error: could not open model file ", filepath
601 select case (line(1:2))
603 nvertices = nvertices + 1
605 model%ntrs = model%ntrs + 1
611 allocate (vertices(nvertices,1:3))
612 allocate (model%trs(model%ntrs))
620 select case (line(1:2))
626 read (line(3:), *) vertices(i,:)
629 read (line(3:), *)
k,
l, iv3
630 model%trs(
j)%v(1,:) = vertices(
k,:)
631 model%trs(
j)%v(2,:) = vertices(
l,:)
632 model%trs(
j)%v(3,:) = vertices(iv3,:)
635 print *,
"Error: unknown line type in OBJ file ", filepath
636 print *,
"Line: ", line
642 deallocate (vertices)
651 character(LEN=*),
intent(in) :: filepath
654 select case (filepath(len(trim(filepath)) - 3:len(trim(filepath))))
660 print *,
"Error: unknown model file format for file ", filepath
670 character(LEN=*),
intent(in) :: filepath
671 type(
t_model),
intent(in) :: model
672 integer :: i,
j, iunit, iostat
673 character(kind=c_char, len=80),
parameter :: header =
"Model file written by MFC."
674 integer(kind=c_int32_t) :: ntriangles
675 real(wp) :: normal(3), v(3)
676 integer(kind=c_int16_t) :: attribute
678 open (newunit=iunit, file=filepath, action=
'WRITE', form=
'UNFORMATTED', iostat=iostat, access=
'STREAM')
680 if (iostat /= 0)
then
681 print *,
"Error: could not open STL file ", filepath
686 ntriangles = model%ntrs
687 write (iunit, iostat=iostat) header, ntriangles
689 if (iostat /= 0)
then
690 print *,
"Error: could not write header to STL file ", filepath
696 normal = model%trs(i)%n
700 v = model%trs(i)%v(
j,:)
705 write (iunit) attribute
715 character(LEN=*),
intent(in) :: filepath
716 type(
t_model),
intent(in) :: model
717 integer :: iunit, iostat
720 open (newunit=iunit, file=filepath, action=
'WRITE', form=
'FORMATTED', iostat=iostat, access=
'STREAM')
722 if (iostat /= 0)
then
723 print *,
"Error: could not open OBJ file ", filepath
728 write (iunit,
'(A)')
"# Model file written by MFC."
732 write (iunit,
'(A, " ", (f30.20), " ", (f30.20), " ", (f30.20))')
"v", model%trs(i)%v(
j, 1), model%trs(i)%v(
j, &
733 & 2), model%trs(i)%v(
j, 3)
736 write (iunit,
'(A, " ", I0, " ", I0, " ", I0)')
"f", i*3 - 2, i*3 - 1, i*3
746 character(LEN=*),
intent(in) :: filepath
747 type(
t_model),
intent(in) :: model
749 select case (filepath(len(trim(filepath)) - 3:len(trim(filepath))))
755 print *,
"Error: unknown model file format for file ", filepath
765 type(
t_model),
intent(inout) :: model
767 deallocate (model%trs)
774 integer,
intent(in) :: iunit
775 character(80),
intent(out) :: line
782 read (iunit,
'(A)', iostat=iostat) line
789 line = adjustl(trim(line))
791 if (len(trim(line)) == 0) cycle
792 if (line(1:5) ==
"solid") cycle
793 if (line(1:1) ==
"#") cycle
803 integer,
intent(in) :: iunit
804 character(80),
intent(inout) :: buffered_line
805 logical,
intent(inout) :: is_buffered
806 character(80) :: line
808 if (is_buffered)
then
810 is_buffered = .false.
828# 468 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
830# 468 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
832# 468 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
834# 468 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
836# 468 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
838# 468 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
840# 468 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
842# 469 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
844 integer,
intent(in) :: ntrs
845 integer,
intent(in) :: pid
846 real(wp),
dimension(1:3),
intent(in) :: point
848 real(wp) :: r1(3), r2(3), r3(3)
849 real(wp) :: r1_mag, r2_mag, r3_mag
850 real(wp) :: numerator, denominator
851 real(wp) :: d1(2), d2(2)
865 fraction = fraction + atan2(d1(1)*d2(2) - d1(2)*d2(1), d1(1)*d2(1) + d1(2)*d2(2))
869 fraction = fraction/(2.0_wp*acos(-1.0_wp))
877 r1_mag = sqrt(dot_product(r1, r1))
878 r2_mag = sqrt(dot_product(r2, r2))
879 r3_mag = sqrt(dot_product(r3, r3))
882 if (r1_mag*r2_mag*r3_mag < tiny(1.0_wp)) cycle
885 numerator = r1(1)*(r2(2)*r3(3) - r2(3)*r3(2)) + r1(2)*(r2(3)*r3(1) - r2(1)*r3(3)) + r1(3)*(r2(1)*r3(2) - r2(2) &
888 denominator = r1_mag*r2_mag*r3_mag + dot_product(r1, r2)*r3_mag + dot_product(r2, r3)*r1_mag + dot_product(r3, &
891 fraction = fraction + atan2(numerator, denominator)
895 fraction = fraction/(2.0_wp*acos(-1.0_wp))
903 type(
t_model),
intent(in) :: model
904 real(wp),
allocatable,
intent(out),
dimension(:,:,:) :: boundary_v
905 integer,
intent(out) :: boundary_vertex_count, boundary_edge_count
907 integer :: edge_count, edge_index, store_index
908 real(wp),
dimension(1:2,1:2) :: edge
909 real(wp),
dimension(1:2) :: boundary_edge
910 real(wp),
dimension(1:(3*model%ntrs),1:2,1:2) :: temp_boundary_v
911 integer,
dimension(1:(3*model%ntrs)) :: edge_occurrence
912 real(wp) :: edgetan, initial, v_norm, xnormal, ynormal
915 edge_count = 3*model%ntrs
924 edge(1,1:2) = model%trs(i)%v(1,1:2)
925 edge(2,1:2) = model%trs(i)%v(2,1:2)
929 edge(1,1:2) = model%trs(i)%v(2,1:2)
930 edge(2,1:2) = model%trs(i)%v(3,1:2)
934 edge(1,1:2) = model%trs(i)%v(3,1:2)
935 edge(2,1:2) = model%trs(i)%v(1,1:2)
941# 566 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
943# 566 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
944#if defined(MFC_OpenACC)
945# 566 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
947# 566 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
948#elif defined(MFC_OpenMP)
949# 566 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
951# 566 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
953# 566 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
955# 566 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
957# 566 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
959# 566 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
961# 567 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
965 if (((abs(temp_boundary_v(i, 1, 1) - temp_boundary_v(
j, 1, &
966 & 1)) < threshold_edge_zero) .and. (abs(temp_boundary_v(i, 1, 2) - temp_boundary_v(
j, 1, &
967 & 2)) < threshold_edge_zero) .and. (abs(temp_boundary_v(i, 2, 1) - temp_boundary_v(
j, 2, &
968 & 1)) < threshold_edge_zero) .and. (abs(temp_boundary_v(i, 2, 2) - temp_boundary_v(
j, 2, &
969 & 2)) < threshold_edge_zero)) .or. ((abs(temp_boundary_v(i, 1, 1) - temp_boundary_v(
j, 2, &
970 & 1)) < threshold_edge_zero) .and. (abs(temp_boundary_v(i, 1, 2) - temp_boundary_v(
j, 2, &
971 & 2)) < threshold_edge_zero) .and. (abs(temp_boundary_v(i, 2, 1) - temp_boundary_v(
j, 1, &
972 & 1)) < threshold_edge_zero) .and. (abs(temp_boundary_v(i, 2, 2) - temp_boundary_v(
j, 1, &
973 & 2)) < threshold_edge_zero)))
then
975# 579 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
976#if defined(MFC_OpenACC)
977# 579 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
979# 579 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
980#elif defined(MFC_OpenMP)
981# 579 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
983# 579 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
985# 580 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
986 edge_occurrence(i) = edge_occurrence(i) + 1
992# 585 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
993#if defined(MFC_OpenACC)
994# 585 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
996# 585 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
997#elif defined(MFC_OpenMP)
998# 585 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1000# 585 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1002# 585 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1004# 586 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1007 boundary_vertex_count = 0
1008 boundary_edge_count = 0
1010 do i = 1, edge_count
1011 if (edge_occurrence(i) == 0)
then
1012 boundary_vertex_count = boundary_vertex_count + 2
1013 boundary_edge_count = boundary_edge_count + 1
1018 allocate (boundary_v(boundary_edge_count,1:3,1:2))
1022 do i = 1, edge_count
1023 if (edge_occurrence(i) == 0)
then
1024 store_index = store_index + 1
1025 boundary_v(store_index, 1,1:2) = temp_boundary_v(i, 1,1:2)
1026 boundary_v(store_index, 2,1:2) = temp_boundary_v(i, 2,1:2)
1031 do i = 1, boundary_edge_count
1032 boundary_edge(1) = boundary_v(i, 2, 1) - boundary_v(i, 1, 1)
1033 boundary_edge(2) = boundary_v(i, 2, 2) - boundary_v(i, 1, 2)
1034 edgetan = boundary_edge(1)/sign(max(sgm_eps, abs(boundary_edge(2))), boundary_edge(2))
1036 if (abs(boundary_edge(2)) < threshold_vector_zero)
then
1037 if (edgetan > 0._wp)
then
1045 initial = boundary_edge(2)
1046 ynormal = -edgetan*initial
1050 v_norm = sqrt(xnormal**2 + ynormal**2)
1051 boundary_v(i, 3, 1) = xnormal/v_norm
1052 boundary_v(i, 3, 2) = ynormal/v_norm
1060 integer,
intent(inout) :: edge_index
1061 integer,
intent(inout) :: edge_count
1062 real(wp),
intent(in),
dimension(1:2,1:2) :: edge
1063 real(wp),
dimension(1:edge_count,1:2,1:2),
intent(inout) :: temp_boundary_v
1066 edge_index = edge_index + 1
1067 temp_boundary_v(edge_index, 1,1:2) = edge(1,1:2)
1068 temp_boundary_v(edge_index, 2,1:2) = edge(2,1:2)
1077# 657 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1079# 657 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1081# 657 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1083# 657 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1085# 657 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1087# 657 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1089# 657 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1091# 658 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1093 integer,
intent(in) :: ntrs
1094 integer,
intent(in) :: pid
1095 real(wp),
dimension(1:3),
intent(in) :: point
1096 real(wp),
dimension(1:3),
intent(out) :: normals
1097 real(wp),
intent(out) :: distance
1099 real(wp) :: dist_min, dist_proj, dist_v, dist_e, t
1100 real(wp) :: v1(1:3), v2(1:3), v3(1:3)
1101 real(wp) :: e0(1:3), e1(1:3), pv(1:3)
1102 real(wp) :: n(1:3), proj(1:3), norm_vec(1:3)
1103 real(wp) :: d, denom, norm_mag
1104 real(wp) :: u, v_bary, w
1105 real(wp) :: l00, l01, l11, l20, l21
1106 real(wp) :: edge(1:3), pe(1:3)
1107 real(wp) :: verts(1:3,1:3)
1109 dist_min = initial_distance_buffer
1122 pv(:) = point(:) - v1(:)
1123 d = dot_product(pv, n)
1124 if (abs(d) >= dist_min) cycle
1125 proj(:) = point(:) - d*n(:)
1128 e0(:) = v2(:) - v1(:)
1129 e1(:) = v3(:) - v1(:)
1130 pv(:) = proj(:) - v1(:)
1132 l00 = dot_product(e0, e0)
1133 l01 = dot_product(e0, e1)
1134 l11 = dot_product(e1, e1)
1135 l20 = dot_product(pv, e0)
1136 l21 = dot_product(pv, e1)
1138 denom = l00*l11 - l01*l01
1141 if (abs(denom) > 0._wp)
then
1142 v_bary = (l11*l20 - l01*l21)/denom
1143 w = (l00*l21 - l01*l20)/denom
1144 u = 1._wp - v_bary - w
1152 if (u >= 0._wp .and. v_bary >= 0._wp .and. w >= 0._wp)
then
1153 dist_proj = sqrt((point(1) - proj(1))**2 + (point(2) - proj(2))**2 + (point(3) - proj(3))**2)
1155 if (dist_proj < dist_min)
then
1156 dist_min = dist_proj
1167 edge(:) = verts(:,mod(
j, 3) + 1) - verts(:,
j)
1168 pe(:) = point(:) - verts(:,
j)
1170 t = dot_product(pe, edge)/max(dot_product(edge, edge), 1.e-30_wp)
1172 if (t >= 0._wp .and. t <= 1._wp)
then
1173 proj(:) = verts(:,
j) + t*edge(:)
1174 dist_e = sqrt((point(1) - proj(1))**2 + (point(2) - proj(2))**2 + (point(3) - proj(3))**2)
1176 if (dist_e < dist_min)
then
1178 norm_vec(:) = proj(:) - point(:)
1179 if (dist_e > 0._wp) norm_vec = norm_vec/dist_e
1181 if (f_approx_equal(dot_product(norm_vec, n), 1._wp))
then
1184 normals(:) = norm_vec(:)
1187 else if (t < 0._wp)
then
1188 dist_v = sqrt((point(1) - verts(1,
j))**2 + (point(2) - verts(2,
j))**2 + (point(3) - verts(3,
j))**2)
1190 if (dist_v < dist_min)
then
1192 norm_vec(:) = verts(:,
j) - point(:)
1193 norm_mag = sqrt(dot_product(norm_vec, norm_vec))
1194 if (norm_mag > 0._wp) norm_vec = norm_vec/norm_mag
1195 normals(:) = norm_vec(:)
1198 dist_v = sqrt((point(1) - verts(1, mod(
j, 3) + 1))**2 + (point(2) - verts(2, mod(
j, &
1199 & 3) + 1))**2 + (point(3) - verts(3, mod(
j, 3) + 1))**2)
1201 if (dist_v < dist_min)
then
1203 norm_vec(:) = verts(:,mod(
j, 3) + 1) - point(:)
1204 norm_mag = sqrt(dot_product(norm_vec, norm_vec))
1205 if (norm_mag > 0._wp) norm_vec = norm_vec/norm_mag
1206 normals(:) = norm_vec(:)
1222# 787 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1224# 787 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1226# 787 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1228# 787 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1230# 787 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1232# 787 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1234# 787 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1236# 788 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1238 real(wp),
dimension(:,:,:),
intent(in) :: boundary_v
1239 integer,
intent(in) :: boundary_edge_count
1240 real(wp),
dimension(1:3),
intent(in) :: point
1241 real(wp),
dimension(1:3),
intent(out) :: normals
1242 real(wp),
intent(out) :: distance
1244 real(wp) :: dist_min, dist, t
1245 real(wp) :: v1(1:2), v2(1:2), edge(1:2), pv(1:2)
1246 real(wp) :: edge_len_sq, proj(1:2), norm(1:2)
1248 dist_min = initial_distance_buffer
1252 do i = 1, boundary_edge_count
1254 v1(1) = boundary_v(i, 1, 1)
1255 v1(2) = boundary_v(i, 1, 2)
1256 v2(1) = boundary_v(i, 2, 1)
1257 v2(2) = boundary_v(i, 2, 2)
1261 pv(1) = point(1) - v1(1)
1262 pv(2) = point(2) - v1(2)
1263 edge_len_sq = dot_product(edge, edge)
1266 if (edge_len_sq > 0._wp)
then
1267 t = dot_product(pv, edge)/edge_len_sq
1273 if (t >= 0._wp .and. t <= 1._wp)
then
1275 dist = sqrt((point(1) - proj(1))**2 + (point(2) - proj(2))**2)
1276 norm(1) = boundary_v(i, 3, 1)
1277 norm(2) = boundary_v(i, 3, 2)
1278 else if (t < 0._wp)
then
1279 dist = sqrt((point(1) - v1(1))**2 + (point(2) - v1(2))**2)
1280 norm(1) = v1(1) - point(1)
1281 norm(2) = v1(2) - point(2)
1284 dist = sqrt((point(1) - v2(1))**2 + (point(2) - v2(2))**2)
1285 norm(1) = v2(1) - point(1)
1286 norm(2) = v2(2) - point(2)
1290 if (dist < dist_min)
then
1292 normals(1) = norm(1)
1293 normals(2) = norm(2)
1305 integer :: boundary_vertex_count, boundary_edge_count
1306 real(wp),
allocatable,
dimension(:,:,:) :: boundary_v
1309 type(
t_bbox) :: bbox, bbox_old
1312 real(wp),
dimension(1:3) :: point, model_center
1313 real(wp) :: grid_mm(1:3,1:2)
1314 real(wp),
dimension(1:4,1:4) :: transform, transform_n
1316 if (num_stl_models == 0)
return
1319# 869 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1321# 869 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1322 use iso_fortran_env,
only: output_unit
1323# 869 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1325# 869 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1326 print *,
'm_model.fpp:869: ',
'@:ALLOCATE(stl_bounding_boxes(num_stl_models,1:3,1:3))'
1327# 869 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1329# 869 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1330 call flush (output_unit)
1331# 869 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1333# 869 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1335# 869 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1337# 869 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1339# 869 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1341# 869 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1342#if defined(MFC_OpenACC)
1343# 869 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1345# 869 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1346#elif defined(MFC_OpenMP)
1347# 869 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1349# 869 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1351# 870 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1353# 870 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1355# 870 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1356 use iso_fortran_env,
only: output_unit
1357# 870 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1359# 870 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1360 print *,
'm_model.fpp:870: ',
'@:ALLOCATE(models(num_stl_models))'
1361# 870 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1363# 870 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1364 call flush (output_unit)
1365# 870 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1367# 870 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1369# 870 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1370 allocate (
models(num_stl_models))
1371# 870 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1373# 870 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1375# 870 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1376#if defined(MFC_OpenACC)
1377# 870 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1379# 870 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1380#elif defined(MFC_OpenMP)
1381# 870 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1383# 870 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1385# 871 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1387 do stl_id = 1, num_stl_models
1388 allocate (
models(stl_id)%model)
1389 if (proc_rank == 0) print *,
" * Reading model: " // trim(stl_models(stl_id)%model_filepath)
1391 model =
f_model_read(stl_models(stl_id)%model_filepath)
1392 params%scale(:) = stl_models(stl_id)%model_scale(:)
1393 params%translate(:) = stl_models(stl_id)%model_translate(:)
1394 params%rotate(:) = 0._wp
1395 params%spc = num_ray
1396 params%threshold = stl_models(stl_id)%model_threshold
1398 if (f_approx_equal(dot_product(params%scale, params%scale), 0._wp))
then
1399 params%scale(:) = 1._wp
1402 if (proc_rank == 0) print *,
" * Transforming model."
1405 bbox_old = f_create_bbox(model)
1406 model_center(1:3) = (bbox_old%min(1:3) + bbox_old%max(1:3))/2._wp
1409 transform = f_create_transform_matrix(params, model_center)
1410 transform_n = f_create_transform_matrix(params)
1412 call s_transform_model(model, transform, transform_n)
1415 bbox = f_create_bbox(model)
1418 if (proc_rank == 0) print *,
' * Number of input model vertices:', 3*model%ntrs
1421 if (p == 0)
call s_check_boundary(model, boundary_v, boundary_vertex_count, boundary_edge_count)
1424 if (proc_rank == 0 .and. p == 0) print *,
' * Number of 2D model boundary edges:', boundary_edge_count
1426 if (proc_rank == 0)
then
1427 write (*,
"(A, 3(2X, F20.10))")
" > Model: Min:", bbox%min(1:3)
1428 write (*,
"(A, 3(2X, F20.10))")
" > Cen:", (bbox%min(1:3) + bbox%max(1:3))/2._wp
1429 write (*,
"(A, 3(2X, F20.10))")
" > Max:", bbox%max(1:3)
1431 grid_mm(1,:) = (/minval(x_cc(0:m)) - 0.5_wp*dx_min, maxval(x_cc(0:m)) + 0.5_wp*dx_min/)
1432 grid_mm(2,:) = (/minval(y_cc(0:n)) - 0.5_wp*dy_min, maxval(y_cc(0:n)) + 0.5_wp*dy_min/)
1435 grid_mm(3,:) = (/minval(z_cc(0:p)) - 0.5_wp*dz_min, maxval(z_cc(0:p)) + 0.5_wp*dz_min/)
1437 grid_mm(3,:) = (/0._wp, 0._wp/)
1440 write (*,
"(A, 3(2X, F20.10))")
" > Domain: Min:", grid_mm(:,1)
1441 write (*,
"(A, 3(2X, F20.10))")
" > Cen:", (grid_mm(:,1) + grid_mm(:,2))/2._wp
1442 write (*,
"(A, 3(2X, F20.10))")
" > Max:", grid_mm(:,2)
1444 if (proc_rank == 0) print *,
" * Transforming model."
1446 stl_bounding_boxes(stl_id, 1,1:3) = [bbox%min(1), (bbox%min(1) + bbox%max(1))/2._wp, bbox%max(1)]
1447 stl_bounding_boxes(stl_id, 2,1:3) = [bbox%min(2), (bbox%min(2) + bbox%max(2))/2._wp, bbox%max(2)]
1448 stl_bounding_boxes(stl_id, 3,1:3) = [bbox%min(3), (bbox%min(3) + bbox%max(3))/2._wp, bbox%max(3)]
1450 models(stl_id)%model = model
1452 models(stl_id)%boundary_v = boundary_v
1453 models(stl_id)%boundary_edge_count = boundary_edge_count
1458# 942 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1459#if defined(MFC_OpenACC)
1460# 942 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1462# 942 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1463#elif defined(MFC_OpenMP)
1464# 942 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1466# 942 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1468# 943 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1470# 943 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1471#if defined(MFC_OpenACC)
1472# 943 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1474# 943 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1475#elif defined(MFC_OpenMP)
1476# 943 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1478# 943 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1480# 944 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1484 integer :: mid, max_ntrs
1485 integer :: max_bv1, max_bv2, max_bv3
1488 max_bv1 = 0; max_bv2 = 0; max_bv3 = 0
1490 do mid = 1, num_stl_models
1491 if (
allocated(
models(mid)%model))
then
1493 max_ntrs = max(max_ntrs,
models(mid)%ntrs)
1495 if (
allocated(
models(mid)%boundary_v))
then
1496 max_bv1 = max(max_bv1,
size(
models(mid)%boundary_v, 1))
1497 max_bv2 = max(max_bv2,
size(
models(mid)%boundary_v, 2))
1498 max_bv3 = max(max_bv3,
size(
models(mid)%boundary_v, 3))
1502 if (max_ntrs > 0)
then
1504# 966 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1506# 966 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1507 use iso_fortran_env,
only: output_unit
1508# 966 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1510# 966 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1511 print *,
'm_model.fpp:966: ',
'@:ALLOCATE(gpu_ntrs(1:num_stl_models))'
1512# 966 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1514# 966 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1515 call flush (output_unit)
1516# 966 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1518# 966 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1520# 966 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1521 allocate (
gpu_ntrs(1:num_stl_models))
1522# 966 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1524# 966 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1526# 966 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1527#if defined(MFC_OpenACC)
1528# 966 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1530# 966 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1531#elif defined(MFC_OpenMP)
1532# 966 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1534# 966 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1536# 967 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1538# 967 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1540# 967 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1541 use iso_fortran_env,
only: output_unit
1542# 967 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1544# 967 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1545 print *,
'm_model.fpp:967: ',
'@:ALLOCATE(gpu_trs_v(1:3, 1:3, 1:max_ntrs, 1:num_stl_models))'
1546# 967 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1548# 967 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1549 call flush (output_unit)
1550# 967 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1552# 967 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1554# 967 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1555 allocate (
gpu_trs_v(1:3, 1:3, 1:max_ntrs, 1:num_stl_models))
1556# 967 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1558# 967 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1560# 967 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1561#if defined(MFC_OpenACC)
1562# 967 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1564# 967 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1565#elif defined(MFC_OpenMP)
1566# 967 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1568# 967 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1570# 968 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1572# 968 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1574# 968 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1575 use iso_fortran_env,
only: output_unit
1576# 968 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1578# 968 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1579 print *,
'm_model.fpp:968: ',
'@:ALLOCATE(gpu_trs_n(1:3, 1:max_ntrs, 1:num_stl_models))'
1580# 968 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1582# 968 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1583 call flush (output_unit)
1584# 968 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1586# 968 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1588# 968 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1589 allocate (
gpu_trs_n(1:3, 1:max_ntrs, 1:num_stl_models))
1590# 968 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1592# 968 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1594# 968 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1595#if defined(MFC_OpenACC)
1596# 968 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1598# 968 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1599#elif defined(MFC_OpenMP)
1600# 968 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1602# 968 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1604# 969 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1606# 969 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1608# 969 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1609 use iso_fortran_env,
only: output_unit
1610# 969 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1612# 969 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1613 print *,
'm_model.fpp:969: ',
'@:ALLOCATE(gpu_boundary_edge_count(1:num_stl_models))'
1614# 969 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1616# 969 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1617 call flush (output_unit)
1618# 969 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1620# 969 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1622# 969 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1624# 969 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1626# 969 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1628# 969 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1629#if defined(MFC_OpenACC)
1630# 969 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1632# 969 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1633#elif defined(MFC_OpenMP)
1634# 969 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1636# 969 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1638# 970 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1645 if (max_bv1 > 0)
then
1647# 977 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1649# 977 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1650 use iso_fortran_env,
only: output_unit
1651# 977 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1653# 977 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1654 print *,
'm_model.fpp:977: ',
'@:ALLOCATE(gpu_boundary_v(1:max_bv1, 1:max_bv2, 1:max_bv3, 1:num_stl_models))'
1655# 977 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1657# 977 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1658 call flush (output_unit)
1659# 977 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1661# 977 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1663# 977 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1664 allocate (
gpu_boundary_v(1:max_bv1, 1:max_bv2, 1:max_bv3, 1:num_stl_models))
1665# 977 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1667# 977 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1669# 977 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1670#if defined(MFC_OpenACC)
1671# 977 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1673# 977 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1674#elif defined(MFC_OpenMP)
1675# 977 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1677# 977 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1679# 978 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1683 do mid = 1, num_stl_models
1684 if (
allocated(
models(mid)%model))
then
1690 if (
allocated(
models(mid)%boundary_v) .and. p == 0)
then
1692 & 1:
size(
models(mid)%boundary_v, 3),mid) =
models(mid)%boundary_v
1697# 994 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1698#if defined(MFC_OpenACC)
1699# 994 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1701# 994 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1702#elif defined(MFC_OpenMP)
1703# 994 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1705# 994 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1707# 995 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1710# 996 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1711#if defined(MFC_OpenACC)
1712# 996 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1714# 996 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1715#elif defined(MFC_OpenMP)
1716# 996 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1718# 996 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1720# 997 "/home/runner/work/MFC/MFC/src/common/m_model.fpp"
1730 type(t_model_array),
intent(inout) :: ma
1733 ma%ntrs = ma%model%ntrs
1734 allocate (ma%trs_v(1:3,1:3,1:ma%ntrs))
1735 allocate (ma%trs_n(1:3,1:ma%ntrs))
1738 ma%trs_v(:,:,i) = ma%model%trs(i)%v(:,:)
1739 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...
Binary STL file reader and processor for immersed boundary geometry.
impure subroutine, public s_model_write(filepath, model)
Write a mesh to a file.
impure subroutine s_write_stl(filepath, model)
Write a binary STL file.
impure logical function f_read_line(iunit, line)
Read the next non-blank, non-comment line from an STL or OBJ model file.
impure subroutine s_read_obj(filepath, model)
Read an OBJ file.
impure subroutine s_skip_ignored_lines(iunit, buffered_line, is_buffered)
Read the next non-comment line from a model file, using a buffered look-ahead mechanism.
real(wp), dimension(:,:,:,:), allocatable, public gpu_trs_v
subroutine, public s_model_free(model)
Free the memory allocated for an STL mesh.
integer, dimension(:), allocatable, public gpu_ntrs
GPU-friendly flat arrays for STL model data.
real(wp), dimension(:,:,:,:), allocatable, public gpu_boundary_v
subroutine, public s_register_edge(temp_boundary_v, edge, edge_index, edge_count)
Append the edge end vertices to a temporary buffer.
impure subroutine s_read_stl(filepath, model)
Read an STL file.
impure type(t_model) function, public f_model_read(filepath)
Read a mesh from a file.
real(wp), dimension(:,:,:), allocatable, public gpu_trs_n
subroutine, public s_check_boundary(model, boundary_v, boundary_vertex_count, boundary_edge_count)
Check and label edges shared by two or more triangle facets of the 2D STL model.
subroutine, public s_distance_normals_3d(ntrs, pid, point, normals, distance)
Determine the levelset distance and normals of 3D models by computing the exact closest point via pro...
type(t_model_array), dimension(:), allocatable, target, public models
STL/OBJ models for IB markers and levelset.
impure subroutine s_write_obj(filepath, model)
Write an OBJ file.
real(wp) function, public f_model_is_inside(ntrs, pid, point)
Determine if a point is inside a surface using the generalized winding number (Jacobson et al....
real(wp), dimension(:,:,:), allocatable, public stl_bounding_boxes
impure subroutine s_read_stl_ascii(filepath, model)
Read an ASCII STL file.
impure subroutine s_read_stl_binary(filepath, model)
Read a binary STL file.
subroutine, public s_instantiate_stl_models()
Load, transform, and register STL/OBJ immersed-boundary models onto the simulation grid.
subroutine, public s_pack_model_for_gpu(ma)
Pack triangle vertices and normals from a model into flat arrays for GPU transfer.
integer, dimension(:), allocatable, public gpu_boundary_edge_count
subroutine, public s_distance_normals_2d(boundary_v, boundary_edge_count, point, normals, distance)
Determine the levelset distance and normals of 2D models by computing the exact closest point via pro...
Broadcasts user inputs and decomposes the domain across MPI ranks for pre-processing.
Defines parameters for a Model Patch.