File: /nfs/home/0/users/jenkins/mfix.git/model/cartesian_grid/define_quadrics.f
1
2
3
4
5
6
7
8
9
10
11
12
13
14 SUBROUTINE DEFINE_QUADRICS
15
16 USE param
17 USE param1
18 USE parallel
19 USE constant
20 USE run
21 USE toleranc
22 USE geometry
23 USE indices
24 USE compar
25 USE sendrecv
26 USE quadric
27 USE cutcell
28 USE vtk
29
30 IMPLICIT NONE
31 DOUBLE PRECISION, DIMENSION(3,3) :: Rx,Ry,Rz,C_QUADRIC,R_QUADRIC
32
33
34
35
36
37 DO QUADRIC_ID = 1 , N_QUADRIC
38
39
40 CALL BUILD_1x3_MATRIX(t_x(QUADRIC_ID),t_y(QUADRIC_ID),t_z(QUADRIC_ID),T_QUADRIC(:,:,QUADRIC_ID))
41
42 CALL BUILD_C_QUADRIC_MATRIX(lambda_x(QUADRIC_ID),lambda_y(QUADRIC_ID),lambda_z(QUADRIC_ID),C_QUADRIC)
43
44 CALL BUILD_X_ROTATION_MATRIX(Theta_x(QUADRIC_ID), Rx)
45 CALL BUILD_Y_ROTATION_MATRIX(Theta_y(QUADRIC_ID), Ry)
46 CALL BUILD_Z_ROTATION_MATRIX(Theta_z(QUADRIC_ID), Rz)
47 R_QUADRIC = MATMUL(Rz,MATMUL(Ry,Rx))
48
49 (:,:,QUADRIC_ID) = MATMUL(TRANSPOSE(R_QUADRIC),MATMUL(C_QUADRIC,R_QUADRIC))
50
51 END DO
52
53
54 = N_QUADRIC
55
56
57 RETURN
58
59
60 END SUBROUTINE DEFINE_QUADRICS
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85 SUBROUTINE GET_F_QUADRIC(x1,x2,x3,Q_ID,f,CLIP_FLAG)
86
87 USE parallel
88 USE compar
89 USE sendrecv
90 USE quadric
91 USE cutcell
92
93 USE quadric
94
95 USE constant, only: pi
96
97
98 IMPLICIT NONE
99
100 DOUBLE PRECISION :: x1,x2,x3,xt,yt,zt,R1,R2,xtr,ytr,ztr
101 DOUBLE PRECISION :: THETA,THETA1,THETA2,THETA3m,THETA3
102 DOUBLE PRECISION :: THETA1CYL1,THETA2TOR,THETA3CYL2,THETA_MIN
103 DOUBLE PRECISION :: Y1,Y2,R
104 DOUBLE PRECISION :: c,s,ytest1,ytest2
105 DOUBLE PRECISION :: f
106 DOUBLE PRECISION :: fxmin,fxmax,fymin,fymax,fzmin,fzmax
107 DOUBLE PRECISION, DIMENSION(1,3) :: X_VECTOR,XMT
108 DOUBLE PRECISION, DIMENSION(3,1) :: TXMT
109 DOUBLE PRECISION, DIMENSION(1,1) :: TEMP_1x1
110 INTEGER :: Q_ID
111 LOGICAL :: CLIP_X,CLIP_Y,CLIP_Z,CLIP_FLAG
112 LOGICAL :: PIECE_X,PIECE_Y,PIECE_Z,PIECE_FLAG
113
114 DOUBLE PRECISION :: YR1,YR2,RR1,RR2,THETA_R1,THETA_R2
115 DOUBLE PRECISION :: YRR1,YRR2,RC1,RC2,YC1,YC2
116
117
118
119
120 = (piece_xmin(Q_ID) <= x1).AND.( x1 <= piece_xmax(Q_ID))
121 PIECE_Y = (piece_ymin(Q_ID) <= x2).AND.( x2 <= piece_ymax(Q_ID))
122 PIECE_Z = (piece_zmin(Q_ID) <= x3).AND.( x3 <= piece_zmax(Q_ID))
123
124 PIECE_FLAG = (PIECE_X.AND.PIECE_Y.AND.PIECE_Z)
125
126 IF(.NOT.PIECE_FLAG) THEN
127 f = UNDEFINED
128 RETURN
129 ENDIF
130
131 CLIP_X = (clip_xmin(Q_ID) <= x1).AND.( x1 <= clip_xmax(Q_ID))
132 CLIP_Y = (clip_ymin(Q_ID) <= x2).AND.( x2 <= clip_ymax(Q_ID))
133 CLIP_Z = (clip_zmin(Q_ID) <= x3).AND.( x3 <= clip_zmax(Q_ID))
134
135 CLIP_FLAG = (CLIP_X.AND.CLIP_Y.AND.CLIP_Z)
136
137
138 IF(TRIM(quadric_form(Q_ID))=='PLANE') THEN
139
140 f = lambda_x(Q_ID)*x1 + lambda_y(Q_ID)*x2 +lambda_z(Q_ID)*x3 + dquadric(Q_ID)
141
142 ELSEIF(TRIM(quadric_form(Q_ID))=='TORUS_INT') THEN
143
144 xt = x1-t_x(Q_ID)
145 yt = x2-t_y(Q_ID)
146 zt = x3-t_z(Q_ID)
147
148 R1 = Torus_R1(Q_ID)
149 R2 = Torus_R2(Q_ID)
150
151 f = -(4*(xt**2+zt**2)*R1**2-(xt**2+yt**2+zt**2+R1**2-R2**2)**2)
152
153
154 ELSEIF(TRIM(quadric_form(Q_ID))=='TORUS_EXT') THEN
155
156 xt = x1-t_x(Q_ID)
157 yt = x2-t_y(Q_ID)
158 zt = x3-t_z(Q_ID)
159
160 xtr = xt
161 ytr = yt
162 ztr = zt
163
164 R1 = Torus_R1(Q_ID)
165 R2 = Torus_R2(Q_ID)
166
167 f = 4*(xtr**2+ztr**2)*R1**2-(xtr**2+ytr**2+ztr**2+R1**2-R2**2)**2
168
169
170 ELSEIF(TRIM(quadric_form(Q_ID))=='Y_UCOIL_EXT') THEN
171
172
173
174
175
176
177
178
179 = DCOS(THETA_Y(Q_ID))
180 s = DSIN(THETA_Y(Q_ID))
181
182
183 = x1-t_x(Q_ID)
184 zt = x3-t_z(Q_ID)
185
186
187 = xt*c + zt*s
188 ztr = -xt*s + zt*c
189
190 R1 = UCOIL_R1(Q_ID)
191 R2 = UCOIL_R2(Q_ID)
192
193
194
195 = UCOIL_Y1(Q_ID) + R1 + R2
196 ytest2 = UCOIL_Y2(Q_ID) - (R1 + R2)
197
198 IF(x2>=ytest2) THEN
199 ytr = x2 - ytest2
200 ELSEIF(x2<=ytest1) THEN
201 ytr = ytest1 - x2
202 ELSE
203 ytr = ZERO
204 ENDIF
205
206 f = 4*(xtr**2+ytr**2)*R1**2-(xtr**2+ytr**2+ztr**2+R1**2-R2**2)**2
207
208 ELSEIF(TRIM(quadric_form(Q_ID))=='Y_UCOIL2_EXT') THEN
209
210
211
212
213
214
215
216
217
218
219 = DCOS(THETA_Y(Q_ID))
220 s = DSIN(THETA_Y(Q_ID))
221
222
223 = x1-t_x(Q_ID)
224 yt = x2
225 zt = x3-t_z(Q_ID)
226
227
228 = xt*c + zt*s
229 ytr = yt
230 ztr = -xt*s + zt*c
231
232 R1 = UCOIL_R1(Q_ID)
233 R2 = UCOIL_R2(Q_ID)
234
235
236
237
238
239
240 = UCOIL_Y1(Q_ID) + R1 + R2
241 ytest2 = UCOIL_Y2(Q_ID) - (R1 + R2)
242
243 IF(ytest1<=ytr.AND.ytr<=ytest2) THEN
244 f = 4*(xtr**2)*R1**2-(xtr**2+ztr**2+R1**2-R2**2)**2
245 ELSEIF(ytr<=ytest1) THEN
246
247 = ATAN2(ytr-ytest1,xtr)
248 IF(-0.75*PI<=THETA.AND.THETA<=-0.25*PI) THEN
249 f = - ( ((ytr-(UCOIL_Y1(Q_ID) + R2))/R2)**2 + (ztr/R2)**2 -1.0 )
250 ELSE
251 f = 4*(xtr**2)*R1**2-(xtr**2+ztr**2+R1**2-R2**2)**2
252 ENDIF
253 ELSEIF(ytr>=ytest2) THEN
254
255 = ATAN2(ytr-ytest2,xtr)
256 IF(0.25*PI<=THETA.AND.THETA<0.75*PI) THEN
257 f = - ( ((ytr-(UCOIL_Y2(Q_ID) - R2))/R2)**2 + (ztr/R2)**2 -1.0 )
258 ELSE
259 f = 4*(xtr**2)*R1**2-(xtr**2+ztr**2+R1**2-R2**2)**2
260 ENDIF
261 ENDIF
262
263
264
265 ELSEIF(TRIM(quadric_form(Q_ID))=='XY_BEND_INT') THEN
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289 = x1-t_x(Q_ID)
290 yt = x2-t_y(Q_ID)
291 zt = x3-t_z(Q_ID)
292
293 R1 = BEND_R1(Q_ID)
294 R2 = BEND_R2(Q_ID)
295
296 = BEND_THETA1(Q_ID)*(pi/180.0D0)
297 THETA2 = BEND_THETA2(Q_ID)*(pi/180.0D0)
298
299
300 = ATAN2(yt,xt)
301 IF(THETA<ZERO) THETA = THETA + 2.0D0*PI
302
303
304 IF(THETA2>THETA1) THEN
305 THETA3m = HALF*(THETA1+THETA2)
306 IF(THETA3m<PI) THEN
307 THETA3 = THETA3m + PI
308 ELSE
309 THETA3 = THETA3m - PI
310 ENDIF
311 ELSE
312 THETA3 = THETA2 + HALF * (THETA1-THETA2)
313 ENDIF
314
315
316
317
318 IF(THETA1>THETA3) THEN
319 THETA1CYL1 = THETA1
320 ELSE
321 THETA1CYL1 = THETA1 + 2.0*PI
322 ENDIF
323
324 IF(THETA2>THETA1) THEN
325 THETA2TOR = THETA2
326 ELSE
327 THETA2TOR = THETA2 + 2.0*PI
328 ENDIF
329
330 IF(THETA3>THETA2) THEN
331 THETA3CYL2 = THETA3
332 ELSE
333 THETA3CYL2 = THETA3 + 2.0*PI
334 ENDIF
335
336 THETA_MIN = DMIN1(THETA1,THETA2,THETA3,THETA1CYL1,THETA2TOR,THETA3CYL2)
337
338 IF(THETA<THETA_MIN) THETA = THETA + 2.0*PI
339
340
341 IF(THETA3<=THETA.AND.THETA<=THETA1CYL1) THEN
342 = DCOS(THETA1)
343 s = DSIN(THETA1)
344
345 = x1-(t_x(Q_ID)+R1*c)
346 yt = x2-(t_y(Q_ID)+R1*s)
347 zt = x3-t_z(Q_ID)
348
349 = xt*c + yt*s
350 ytr = -xt*s + yt*c
351 ztr = zt
352
353 f = (xtr/R2)**2 + (ztr/R2)**2 -1.0
354
355 ELSEIF(THETA1<=THETA.AND.THETA<=THETA2TOR) THEN
356
357 = x1-t_x(Q_ID)
358 yt = x2-t_y(Q_ID)
359 zt = x3-t_z(Q_ID)
360
361 = xt
362 ytr = yt
363 ztr = zt
364
365 f = -4*(xtr**2+ytr**2)*R1**2+(xtr**2+ytr**2+ztr**2+R1**2-R2**2)**2
366
367 ELSEIF(THETA2<=THETA.AND.THETA<=THETA3CYL2) THEN
368 = DCOS(THETA2)
369 s = DSIN(THETA2)
370
371 = x1-(t_x(Q_ID)+R1*c)
372 yt = x2-(t_y(Q_ID)+R1*s)
373 zt = x3-t_z(Q_ID)
374
375 = xt*c + yt*s
376 ytr = -xt*s + yt*c
377 ztr = zt
378
379 f = (xtr/R2)**2 + (ztr/R2)**2 -1.0
380
381 ELSE
382 WRITE(*,*)' Error in processing elbow.','THETA = ',THETA/PI*180.0
383 CALL MFIX_EXIT(myPE)
384 ENDIF
385
386 ELSEIF(TRIM(quadric_form(Q_ID))=='Y_C2C_INT') THEN
387
388
389
390
391
392 = x1-t_x(Q_ID)
393 yt = x2-t_y(Q_ID)
394 zt = x3-t_z(Q_ID)
395
396
397 = xt
398 ytr = yt
399 ztr = zt
400
401
402 = C2C_R1(Q_ID)
403 R2 = C2C_R2(Q_ID)
404
405 = C2C_Y1(Q_ID)
406 Y2 = C2C_Y2(Q_ID)
407
408 IF(ytr>=Y2) THEN
409 R = R2
410 ELSEIF(ytr<=Y1) THEN
411 R = R1
412 ELSE
413 IF(Y2/=Y1) THEN
414 = R1 + (R2-R1)/(Y2-Y1)*(ytr-Y1)
415 ELSE
416 R = R1
417 ENDIF
418 ENDIF
419
420 f = (xtr/R)**2 + (ztr/R)**2 - 1.0
421
422
423 ELSEIF(TRIM(quadric_form(Q_ID))=='REACTOR1') THEN
424
425
426
427
428
429 = x1-t_x(Q_ID)
430 yt = x2-t_y(Q_ID)
431 zt = x3-t_z(Q_ID)
432
433
434 = xt
435 ytr = yt
436 ztr = zt
437
438
439 = REACTOR1_R1(Q_ID)
440 = REACTOR1_R2(Q_ID)
441
442
443 = REACTOR1_Y1(Q_ID)
444 = REACTOR1_Y2(Q_ID)
445
446
447 = REACTOR1_YR1(Q_ID)
448 = REACTOR1_RR1(Q_ID)
449 = REACTOR1_THETA1(Q_ID)
450
451 = REACTOR1_YR2(Q_ID)
452 = REACTOR1_RR2(Q_ID)
453 = REACTOR1_THETA2(Q_ID)
454
455
456 = YR1 - RR1 * DSIN(THETA1)
457 RC1 = R1-RR1*(ONE-DCOS(THETA1))
458 YC1 = YRR1 - RC1/DTAN(THETA1)
459 YRR2 = YR2 + RR2 * DSIN(THETA2)
460 RC2 = R2-RR2*(ONE-DCOS(THETA2))
461 YC2 = YRR2 + RC2/DTAN(THETA2)
462
463 IF(ytr>=YC2) THEN
464
465 = ZERO
466
467 ELSEIF(YRR2<=ytr.AND.ytr<=YC2) THEN
468
469 = RC2/(YRR2-YC2)*(ytr-YC2)
470
471 ELSEIF(YR2<=ytr.AND.ytr<=YRR2) THEN
472
473 = R2 - RR2 + DSQRT(RR2**2 - (YR2-ytr)**2)
474
475 ELSEIF(Y2<=ytr.AND.ytr<=YR2) THEN
476
477 = R2
478
479 ELSEIF(Y1<=ytr.AND.ytr<=Y2) THEN
480
481 = R1 + (R2-R1)/(Y2-Y1)*(ytr-Y1)
482
483 ELSEIF(YR1<=ytr.AND.ytr<=Y1) THEN
484
485 = R1
486
487 ELSEIF(YRR1<=ytr.AND.ytr<=YR1) THEN
488
489 = R1 - RR1 + DSQRT(RR1**2 - (YR1-ytr)**2)
490
491 ELSEIF(YC1<=ytr.AND.ytr<=YRR1) THEN
492
493 = RC1/(YRR1-YC1)*(ytr-YC1)
494
495 ELSE
496
497 R = ZERO
498
499 ENDIF
500
501
502 IF(R>ZERO) THEN
503 f = (xtr/R)**2 + (ztr/R)**2 - 1.0
504 ELSE
505 IF(ytr<=YC1) THEN
506 f = YC1 - ytr
507 ELSE
508 f = ytr - YC2
509 ENDIF
510 ENDIF
511
512
513 ELSE
514
515 CALL BUILD_1x3_MATRIX(x1,x2,x3,X_VECTOR)
516
517 XMT = X_VECTOR - T_QUADRIC(:,:,Q_ID)
518 TXMT = TRANSPOSE(XMT)
519
520 TEMP_1x1 = MATMUL(XMT,MATMUL(A_QUADRIC(:,:,Q_ID),TXMT))
521
522 f = TEMP_1x1(1,1) + dquadric(Q_ID)
523
524 ENDIF
525
526
527
528
529
530
531
532
533
534
535
536
537 IF(FLUID_IN_CLIPPED_REGION(Q_ID)) THEN
538
539 IF(clip_xmin(Q_ID)/=UNDEFINED) THEN
540 fxmin = -(clip_xmin(Q_ID)-x1)
541 f = dmin1(f,fxmin)
542 ENDIF
543
544 IF(clip_xmax(Q_ID)/=UNDEFINED) THEN
545 fxmax = -(x1-clip_xmax(Q_ID))
546 f = dmin1(f,fxmax)
547 ENDIF
548
549 IF(clip_ymin(Q_ID)/=UNDEFINED) THEN
550 fymin = -(clip_ymin(Q_ID)-x2)
551 f = dmin1(f,fymin)
552 ENDIF
553
554 IF(clip_ymax(Q_ID)/=UNDEFINED) THEN
555 fymax = -(x2-clip_ymax(Q_ID))
556 f = dmin1(f,fymax)
557 ENDIF
558
559 IF(clip_zmin(Q_ID)/=UNDEFINED) THEN
560 fzmin = -(clip_zmin(Q_ID)-x3)
561 f = dmin1(f,fzmin)
562 ENDIF
563
564 IF(clip_zmax(Q_ID)/=UNDEFINED) THEN
565 fzmax = -(x3-clip_zmax(Q_ID))
566 f = dmin1(f,fzmax)
567 ENDIF
568
569 ELSE
570
571 IF(clip_xmin(Q_ID)/=UNDEFINED) THEN
572 fxmin = clip_xmin(Q_ID)-x1
573 f = dmax1(f,fxmin)
574 ENDIF
575
576 IF(clip_xmax(Q_ID)/=UNDEFINED) THEN
577 fxmax = x1-clip_xmax(Q_ID)
578 f = dmax1(f,fxmax)
579 ENDIF
580
581 IF(clip_ymin(Q_ID)/=UNDEFINED) THEN
582 fymin = clip_ymin(Q_ID)-x2
583 f = dmax1(f,fymin)
584 ENDIF
585
586 IF(clip_ymax(Q_ID)/=UNDEFINED) THEN
587 fymax = x2-clip_ymax(Q_ID)
588 f = dmax1(f,fymax)
589 ENDIF
590
591 IF(clip_zmin(Q_ID)/=UNDEFINED) THEN
592 fzmin = clip_zmin(Q_ID)-x3
593 f = dmax1(f,fzmin)
594 ENDIF
595
596 IF(clip_zmax(Q_ID)/=UNDEFINED) THEN
597 fzmax = x3-clip_zmax(Q_ID)
598 f = dmax1(f,fzmax)
599 ENDIF
600
601 ENDIF
602
603 RETURN
604 END SUBROUTINE GET_F_QUADRIC
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628 SUBROUTINE REASSSIGN_QUADRIC(x1,x2,x3,GROUP,Q_ID)
629
630 USE compar
631 USE quadric
632
633 IMPLICIT NONE
634
635 DOUBLE PRECISION x1,x2,x3
636 INTEGER :: I,Q_ID,GROUP,GS,P
637 LOGICAL :: PIECE_X,PIECE_Y,PIECE_Z,PIECE_FLAG
638 CHARACTER(LEN=9) :: GR
639
640 Q_ID = 0
641
642 GS = GROUP_SIZE(GROUP)
643 GR = TRIM(GROUP_RELATION(GROUP))
644
645 IF( GR /= 'PIECEWISE') RETURN
646
647 DO P = 1 , GS
648
649 I = GROUP_Q(GROUP,P)
650
651 PIECE_X = (piece_xmin(I) <= x1).AND.( x1 <= piece_xmax(I))
652 PIECE_Y = (piece_ymin(I) <= x2).AND.( x2 <= piece_ymax(I))
653 PIECE_Z = (piece_zmin(I) <= x3).AND.( x3 <= piece_zmax(I))
654
655 PIECE_FLAG = (PIECE_X.AND.PIECE_Y.AND.PIECE_Z)
656
657 IF (PIECE_FLAG) Q_ID = I
658
659 ENDDO
660
661 IF(Q_ID == 0 ) THEN
662 WRITE(*,*)' No Quadric defined at current location x,y,z=', x1,x2,x3
663 WRITE(*,*)' Please Check piecewise limits of quadric(s)'
664 WRITE(*,*)' Mfix will exit now.'
665 CALL MFIX_EXIT(myPE)
666 ENDIF
667
668 RETURN
669
670
671 END SUBROUTINE REASSSIGN_QUADRIC
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689 SUBROUTINE BUILD_1x3_MATRIX(scalar1,scalar2,scalar3,M1x3)
690
691 IMPLICIT NONE
692
693 DOUBLE PRECISION:: scalar1,scalar2,scalar3
694 DOUBLE PRECISION, DIMENSION(1,3) :: M1x3
695 M1x3(1,1) = scalar1
696 M1x3(1,2) = scalar2
697 M1x3(1,3) = scalar3
698
699 RETURN
700
701 END SUBROUTINE BUILD_1x3_MATRIX
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719 SUBROUTINE BUILD_C_QUADRIC_MATRIX(lambda1,lambda2,lambda3,C_QUADRIC)
720
721 USE param1, only: one, zero
722 USE constant, only: pi
723
724 IMPLICIT NONE
725
726 DOUBLE PRECISION:: lambda1,lambda2,lambda3
727 DOUBLE PRECISION, DIMENSION(3,3) :: C_QUADRIC
728
729
730
731 = TRANSPOSE(RESHAPE((/ &
732 lambda1 , ZERO , ZERO ,&
733 ZERO , lambda2 , ZERO ,&
734 ZERO , ZERO , lambda3 /),&
735 (/3,3/)))
736 RETURN
737
738 END SUBROUTINE BUILD_C_QUADRIC_MATRIX
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756 SUBROUTINE BUILD_X_ROTATION_MATRIX(Theta, R)
757
758 USE param1, only: one, zero
759 USE constant, only: pi
760
761 IMPLICIT NONE
762
763 DOUBLE PRECISION:: Theta
764 DOUBLE PRECISION, DIMENSION(3,3) :: R
765
766 theta = theta * (pi/180.0D0)
767
768
769
770 = TRANSPOSE(RESHAPE((/ &
771 ONE , ZERO , ZERO ,&
772 ZERO , dcos(theta) , dsin(theta) ,&
773 ZERO , -dsin(theta) , dcos(theta) /),&
774 (/3,3/)))
775
776 RETURN
777
778 END SUBROUTINE BUILD_X_ROTATION_MATRIX
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794 SUBROUTINE BUILD_Y_ROTATION_MATRIX(Theta, R)
795
796 USE param1, only: one, zero
797 USE constant, only: pi
798
799 IMPLICIT NONE
800
801 DOUBLE PRECISION:: Theta
802 DOUBLE PRECISION, DIMENSION(3,3) :: R
803
804 theta = theta * (pi/180.0D0)
805
806
807
808 = TRANSPOSE(RESHAPE((/ &
809 dcos(theta) , ZERO , dsin(theta) ,&
810 ZERO , ONE , ZERO ,&
811 -dsin(theta) , ZERO , dcos(theta) /),&
812 (/3,3/)))
813
814 RETURN
815
816 END SUBROUTINE BUILD_Y_ROTATION_MATRIX
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833 SUBROUTINE BUILD_Z_ROTATION_MATRIX(Theta, R)
834
835 USE param1, only: one, zero
836 USE constant, only: pi
837
838 IMPLICIT NONE
839
840 DOUBLE PRECISION:: Theta
841 DOUBLE PRECISION, DIMENSION(3,3) :: R
842
843 theta = theta * (pi/180.0D0)
844
845
846
847 = TRANSPOSE(RESHAPE((/ &
848 dcos(theta) , dsin(theta) , ZERO ,&
849 -dsin(theta) , dcos(theta) , ZERO ,&
850 ZERO , ZERO , ONE /),&
851 (/3,3/)))
852
853 RETURN
854
855 END SUBROUTINE BUILD_Z_ROTATION_MATRIX
856