{"id":782,"date":"2020-02-06T18:13:53","date_gmt":"2020-02-06T22:13:53","guid":{"rendered":"https:\/\/www2.whoi.edu\/site\/aomip\/?page_id=782"},"modified":"2021-06-18T09:26:49","modified_gmt":"2021-06-18T13:26:49","slug":"euler-rotation-fortran-code","status":"publish","type":"page","link":"https:\/\/www2.whoi.edu\/site\/aomip\/models\/euler-rotation-fortran-code\/","title":{"rendered":"Euler Rotation &#8211; Fortran Code"},"content":{"rendered":"\n\n\t<h1>Euler Rotation &#8211; Fortran Code<\/h1>\n<h2>Fortran Module<\/h2>\n<p>MODULE C_MODULE_EULER_ROTATION<\/p>\n!&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\n! euler rotation of model geometry<br \/>\n!&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\n!<br \/>\n! C_ALPHA : rotation about z-axis<br \/>\n! C_BETA\u00a0 : rotation about new y-axis<br \/>\n! C_GAMMA : rotation about new z-axis<br \/>\n!<br \/>\n! C_FORWARD : rotation matricies to geographic coordinates<br \/>\n! C_REVERSE : rotation matricies to model coordinates<br \/>\n!<br \/>\n!&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;\nREAL (TYPE_REAL_8) ::<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 C_ALPHA\u00a0 = 000.0\nREAL (TYPE_REAL_8) ::<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 C_BETA\u00a0\u00a0 = 000.0\nREAL (TYPE_REAL_8) ::<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 C_GAMMA\u00a0 = 000.0\nREAL (TYPE_REAL_8),<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 DIMENSION (1:3, 1:3) ::<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 C_FORWARD = 0.0\nREAL (TYPE_REAL_8),<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 DIMENSION (1:3, 1:3) ::<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 C_REVERSE = 0.0\n<p>!&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<\/p>\n<p>END MODULE C_MODULE_EULER_ROTATION<\/p>\n<h2>Euler Matrix<\/h2>\n<p>SUBROUTINE C_EULER_ROTATION_MATRIX<\/p>\n!&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\n! purpose: compute euler rotation matrix<br \/>\n!&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\n!<br \/>\n! C_ALPHA\u00a0\u00a0 : rotation about z-axis<br \/>\n! C_BETA\u00a0\u00a0\u00a0 : rotation about new y-axis<br \/>\n! C_GAMMA\u00a0\u00a0 : rotation about new z-axis<br \/>\n! C_REVERSE : rotation to model coordinates<br \/>\n! C_FORWARD : rotation to geographic coordinates<br \/>\n!<br \/>\n!&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;\n!local vars<br \/>\nREAL (TYPE_REAL_8) ::<br \/>\n&amp;<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 COSA,<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 SINA,<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 COSB,<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 SINB,<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 COSG,<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 SING\n<p>!&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<\/p>\n!compute sin and cos of all angles in degrees<br \/>\nCOSA\u00a0 = C_COSD (C_ALPHA )<br \/>\nSINA\u00a0 = C_SIND (C_ALPHA )<br \/>\nCOSB\u00a0 = C_COSD (C_BETA\u00a0 )<br \/>\nSINB\u00a0 = C_SIND (C_BETA\u00a0 )<br \/>\nCOSG\u00a0 = C_COSD (C_GAMMA )<br \/>\nSING\u00a0 = C_SIND (C_GAMMA )\n!compute rotation matrix into model coordinates<br \/>\nC_REVERSE (1,1) =\u00a0\u00a0 COSA * COSB * COSG\u00a0 &#8211;\u00a0 SINA * SING<br \/>\nC_REVERSE (1,2) =\u00a0\u00a0 SINA * COSB * COSG\u00a0 +\u00a0 COSA * SING<br \/>\nC_REVERSE (1,3) =\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &#8211; SINB * COSG<br \/>\nC_REVERSE (2,1) = &#8211; COSA * COSB * SING\u00a0 &#8211;\u00a0 SINA * COSG<br \/>\nC_REVERSE (2,2) = &#8211; SINA * COSB * SING\u00a0 +\u00a0 COSA * COSG<br \/>\nC_REVERSE (2,3) =\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SINB * SING<br \/>\nC_REVERSE (3,1) =\u00a0\u00a0 COSA * SINB<br \/>\nC_REVERSE (3,2) =\u00a0\u00a0 SINA * SINB<br \/>\nC_REVERSE (3,3) =\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 COSB\n!compute rotation matrix into geographical coordinates<br \/>\nC_FORWARD (1,1) =\u00a0\u00a0 COSG * COSB * COSA\u00a0 &#8211;\u00a0 SING * SINA<br \/>\nC_FORWARD (1,2) = &#8211; SING * COSB * COSA\u00a0 &#8211;\u00a0 COSG * SINA<br \/>\nC_FORWARD (1,3) =\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SINB * COSA<br \/>\nC_FORWARD (2,1) =\u00a0\u00a0 COSG * COSB * SINA\u00a0 +\u00a0 SING * COSA<br \/>\nC_FORWARD (2,2) = &#8211; SING * COSB * SINA\u00a0 +\u00a0 COSG * COSA<br \/>\nC_FORWARD (2,3) =\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SINB * SINA<br \/>\nC_FORWARD (3,1) = &#8211; COSG * SINB<br \/>\nC_FORWARD (3,2) =\u00a0\u00a0 SING * SINB<br \/>\nC_FORWARD (3,3) =\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 COSB\n<p>!&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<\/p>\n<p>END SUBROUTINE C_EULER_ROTATION_MATRIX<\/p>\n<h2>Native-Grid -&gt; AOMIP-Grid<\/h2>\nSUBROUTINE C_GEO_TO_MODEL (X_IN_ANGLE,<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Y_IN_ANGLE,<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 X_OUT_ANGLE,<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Y_OUT_ANGLE)\n!&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\n! purpose: a coordinate transformation from geographic coordinates<br \/>\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 to model coordinates<br \/>\n!&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\n!<br \/>\n! variables<br \/>\n!<br \/>\n! X_IN_ANGLE\u00a0 : X-COORDINATE IN GEOGRAPHICAL SYSTEM.<br \/>\n! Y_IN_ANGLE\u00a0 : Y-COORDINATE IN GEOGRAPHICAL SYSTEM.<br \/>\n! X_OUT_ANGLE : X-COORDINATE IN MODEL SYSTEM.<br \/>\n! Y_OUT_ANGLE : Y-COORDINATE IN MODEL SYSTEM.<br \/>\n!<br \/>\n!&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;\n!passed arguments<br \/>\nREAL (TYPE_REAL_8),<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 INTENT (IN) ::<br \/>\n&amp;<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 X_IN_ANGLE,<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 Y_IN_ANGLE\n!passed arguments<br \/>\nREAL (TYPE_REAL_8),<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 INTENT (OUT) ::<br \/>\n&amp;<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 X_OUT_ANGLE,<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 Y_OUT_ANGLE\n!local vars<br \/>\nREAL (TYPE_REAL_8) ::<br \/>\n&amp;<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 X_TMP_ANGLE,<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 Y_TMP_ANGLE,<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 XX,<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 YY,<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 ZZ,<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 XNEW,<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 YNEW,<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 ZNEW,<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 COSTN,<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 PHI_NEW,<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 THETA_NEW\n<p>!&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/p>\n!initial angles of rotation<br \/>\nX_TMP_ANGLE = X_IN_ANGLE<br \/>\nY_TMP_ANGLE = Y_IN_ANGLE\n!avoid trouble of an exactly zero angle by adding offset<br \/>\nX_TMP_ANGLE = X_TMP_ANGLE + C_EPSILON<br \/>\nY_TMP_ANGLE = Y_TMP_ANGLE + C_EPSILON\n!spherical to cartesian<br \/>\nXX = C_COSD (Y_TMP_ANGLE) * C_COSD (X_TMP_ANGLE)<br \/>\nYY = C_COSD (Y_TMP_ANGLE) * C_SIND (X_TMP_ANGLE)<br \/>\nZZ = C_SIND (Y_TMP_ANGLE)\n!new cartesian coordinates are given by<br \/>\nXNEW = C_REVERSE (1,1) * XX<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0 + C_REVERSE (1,2) * YY<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0 + C_REVERSE (1,3) * ZZ<br \/>\nYNEW = C_REVERSE (2,1) * XX<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0 + C_REVERSE (2,2) * YY<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0 + C_REVERSE (2,3) * ZZ<br \/>\nZNEW = C_REVERSE (3,1) * XX<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0 + C_REVERSE (3,2) * YY<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0 + C_REVERSE (3,3) * ZZ\nTHETA_NEW\u00a0 = C_INV_SIND (ZNEW)<br \/>\nCOSTN = SQRT (1.0 &#8211; ZNEW ** 2)\n<p>IF ((XNEW &gt; 0.0).AND.(YNEW &gt; 0.0)) THEN<\/p>\nIF (XNEW &lt; YNEW) THEN<br \/>\nPHI_NEW= C_INV_COSD (XNEW\/COSTN)<br \/>\nELSE<br \/>\nPHI_NEW= C_INV_SIND (YNEW\/COSTN)<br \/>\nENDIF\n<p>ELSEIF ((XNEW &lt; 0.0).AND.(YNEW &gt; 0.0)) THEN<\/p>\nIF (ABS(XNEW) &lt; YNEW) THEN<br \/>\nPHI_NEW = 180.0 &#8211; C_INV_COSD (ABS(XNEW)\/COSTN)<br \/>\nELSE<br \/>\nPHI_NEW = 180.0 &#8211; C_INV_SIND (YNEW\/COSTN)<br \/>\nENDIF\n<p>ELSEIF ((XNEW &lt; 0.0).AND.(YNEW &lt; 0.0)) THEN<\/p>\nIF (ABS(XNEW) &lt; ABS(YNEW)) THEN<br \/>\nPHI_NEW =-180.0 + C_INV_COSD (ABS(XNEW)\/COSTN)<br \/>\nELSE<br \/>\nPHI_NEW =-180.0 + C_INV_SIND (ABS(YNEW)\/COSTN)<br \/>\nENDIF\n<p>ELSEIF ((XNEW &gt; 0.0) .AND. (YNEW &lt; 0.0)) THEN<\/p>\nIF (\u00a0\u00a0\u00a0 XNEW\u00a0 &lt; ABS(YNEW)) THEN<br \/>\nPHI_NEW =-C_INV_COSD (ABS(XNEW)\/COSTN)<br \/>\nELSE<br \/>\nPHI_NEW =-C_INV_SIND (ABS(YNEW)\/COSTN)<br \/>\nENDIF\n<p>ENDIF<\/p>\n!new spherical coordinates are<br \/>\nY_OUT_ANGLE = THETA_NEW<br \/>\nX_OUT_ANGLE = PHI_NEW\n<p>IF (X_OUT_ANGLE &lt; 0.0) X_OUT_ANGLE = X_OUT_ANGLE + 360.0<\/p>\n!avoid trouble of an exactly zero angle by subtracting offset<br \/>\nX_OUT_ANGLE = X_OUT_ANGLE &#8211; C_EPSILON<br \/>\nY_OUT_ANGLE = Y_OUT_ANGLE &#8211; C_EPSILON\n<p>!&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/p>\n<p>END SUBROUTINE C_GEO_TO_MODEL<\/p>\n<h2>AOMIP-Grid -&gt; Native_Grid<\/h2>\nSUBROUTINE C_MODEL_TO_GEO (X_IN_ANGLE,<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Y_IN_ANGLE,<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 X_OUT_ANGLE,<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Y_OUT_ANGLE)\n!&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n! purpose: a coordinate trnansformation from model coordinates<br \/>\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 to geographic coordinates<br \/>\n!&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\n!<br \/>\n! variables<br \/>\n!<br \/>\n! X_IN_ANGLE\u00a0 : X-COORDINATE IN MODEL SYSTEM.<br \/>\n! Y_IN_ANGLE\u00a0 : Y-COORDINATE IN MODEL SYSTEM.<br \/>\n! X_OUT_ANGLE : X-COORDINATE IN GEOGRAPHICAL SYSTEM.<br \/>\n! Y_OUT_ANGLE : Y-COORDINATE IN GEOGRAPHICAL SYSTEM.<br \/>\n!<br \/>\n! THE ROTATION FROM THE COORDINATE SYSTEM,<br \/>\n! X&#8221;&#8217;,Y&#8221;&#8217;,Z&#8221;&#8217; BACK TO THE ORIGINAL COORDINATE SYTEM<br \/>\n! CAN BE PERFORMED BY DOING THE ROTATION IN<br \/>\n! REVERSED ORDER AND WITH OPPOSITE SIGN ON THE ROTATED ANGLES.<br \/>\n!<br \/>\n!&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;\n!passed arguments<br \/>\nREAL (TYPE_REAL_8),<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 INTENT (IN) ::<br \/>\n&amp;<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 X_IN_ANGLE,<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 Y_IN_ANGLE\n!passed arguments<br \/>\nREAL (TYPE_REAL_8),<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 INTENT (OUT) ::<br \/>\n&amp;<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 X_OUT_ANGLE,<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 Y_OUT_ANGLE\n!local vars<br \/>\nREAL (TYPE_REAL_8) ::<br \/>\n&amp;<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 X_TMP_ANGLE,<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 Y_TMP_ANGLE,<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 XX,<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 YY,<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 ZZ,<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 XNEW,<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 YNEW,<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 ZNEW,<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 COSTN,<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 PHI_NEW,<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0\u00a0 THETA_NEW\n<p>!&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/p>\n!initial angles of rotation<br \/>\nX_TMP_ANGLE = X_IN_ANGLE<br \/>\nY_TMP_ANGLE = Y_IN_ANGLE\n!avoid trouble of an exactly zero angle by adding offset<br \/>\nX_TMP_ANGLE = X_TMP_ANGLE + C_EPSILON<br \/>\nY_TMP_ANGLE = Y_TMP_ANGLE + C_EPSILON\n!spherical coordiantes to cartesian coordinates<br \/>\nXX = C_COSD (Y_TMP_ANGLE) * C_COSD (X_TMP_ANGLE)<br \/>\nYY = C_COSD (Y_TMP_ANGLE) * C_SIND (X_TMP_ANGLE)<br \/>\nZZ = C_SIND (Y_TMP_ANGLE)\n!new cartesian coordinates are given by<br \/>\nXNEW = C_FORWARD (1,1) * XX<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0 + C_FORWARD (1,2) * YY<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0 + C_FORWARD (1,3) * ZZ<br \/>\nYNEW = C_FORWARD (2,1) * XX<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0 + C_FORWARD (2,2) * YY<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0 + C_FORWARD (2,3) * ZZ<br \/>\nZNEW = C_FORWARD (3,1) * XX<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0 + C_FORWARD (3,2) * YY<br \/>\n&amp;\u00a0\u00a0\u00a0\u00a0 + C_FORWARD (3,3) * ZZ\n!obtain new angles THETA_NEW,COSTN,PHI_NEW<br \/>\nTHETA_NEW\u00a0 = C_INV_SIND (ZNEW)<br \/>\nCOSTN = SQRT (1.0 &#8211; ZNEW**2)\n<p>IF\u00a0\u00a0\u00a0 ((XNEW &gt; 0.0) .AND. (YNEW &gt; 0.0)) THEN<\/p>\nIF (XNEW &lt; YNEW) THEN<br \/>\nPHI_NEW = C_INV_COSD (XNEW\/COSTN)<br \/>\nELSE<br \/>\nPHI_NEW = C_INV_SIND (YNEW\/COSTN)<br \/>\nENDIF\n<p>ELSEIF ((XNEW &lt; 0.0) .AND. (YNEW &gt; 0.0)) THEN<\/p>\nIF (ABS (XNEW) &lt; YNEW) THEN<br \/>\nPHI_NEW = 180.0 &#8211; C_INV_COSD (ABS (XNEW)\/COSTN)<br \/>\nELSE<br \/>\nPHI_NEW = 180.0 &#8211; C_INV_SIND (YNEW\/COSTN)<br \/>\nENDIF\n<p>ELSEIF ((XNEW &lt; 0.0) .AND. (YNEW &lt; 0.0)) THEN<\/p>\nIF (ABS (XNEW) &lt; ABS (YNEW)) THEN<br \/>\nPHI_NEW =-180.0 + C_INV_COSD (ABS (XNEW)\/COSTN)<br \/>\nELSE<br \/>\nPHI_NEW =-180.0 + C_INV_SIND (ABS (YNEW)\/COSTN)<br \/>\nENDIF\n<p>ELSEIF ((XNEW &gt; 0.0) .AND. (YNEW &lt; 0.0)) THEN<\/p>\nIF(\u00a0\u00a0\u00a0 XNEW\u00a0 &lt; ABS (YNEW)) THEN<br \/>\nPHI_NEW =\u00a0\u00a0\u00a0 &#8211; C_INV_COSD (ABS (XNEW)\/COSTN)<br \/>\nELSE<br \/>\nPHI_NEW =\u00a0\u00a0\u00a0 &#8211; C_INV_SIND (ABS (YNEW)\/COSTN)<br \/>\nENDIF\n<p>ENDIF<\/p>\n!new spherical coordinates<br \/>\nX_OUT_ANGLE = PHI_NEW<br \/>\nY_OUT_ANGLE = THETA_NEW\n<p>IF (X_OUT_ANGLE &lt; 0.0) X_OUT_ANGLE = X_OUT_ANGLE + 360.0<\/p>\n!avoid trouble of an exactly zero angle by subtracting offset<br \/>\nX_OUT_ANGLE = X_OUT_ANGLE &#8211; C_EPSILON<br \/>\nY_OUT_ANGLE = Y_OUT_ANGLE &#8211; C_EPSILON\n<p>!&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<\/p>\n<p>END SUBROUTINE C_MODEL_TO_GEO<\/p>\n\n","protected":false},"excerpt":{"rendered":"<p>Euler Rotation &#8211; Fortran Code Fortran Module MODULE C_MODULE_EULER_ROTATION !&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; ! euler rotation of model geometry !&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; ! ! C_ALPHA : rotation about z-axis ! C_BETA\u00a0 : rotation about new y-axis ! C_GAMMA : rotation about new z-axis ! ! C_FORWARD : rotation matricies to geographic coordinates ! C_REVERSE : rotation matricies to model coordinates&hellip;<\/p>\n","protected":false},"author":83,"featured_media":0,"parent":628,"menu_order":4,"comment_status":"closed","ping_status":"closed","template":"tpl-sidebar.php","meta":{"advanced-sidebar-menu\/link-title":"","advanced-sidebar-menu\/exclude-page":false},"_links":{"self":[{"href":"https:\/\/www2.whoi.edu\/site\/aomip\/wp-json\/wp\/v2\/pages\/782"}],"collection":[{"href":"https:\/\/www2.whoi.edu\/site\/aomip\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www2.whoi.edu\/site\/aomip\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www2.whoi.edu\/site\/aomip\/wp-json\/wp\/v2\/users\/83"}],"replies":[{"embeddable":true,"href":"https:\/\/www2.whoi.edu\/site\/aomip\/wp-json\/wp\/v2\/comments?post=782"}],"version-history":[{"count":3,"href":"https:\/\/www2.whoi.edu\/site\/aomip\/wp-json\/wp\/v2\/pages\/782\/revisions"}],"predecessor-version":[{"id":1687,"href":"https:\/\/www2.whoi.edu\/site\/aomip\/wp-json\/wp\/v2\/pages\/782\/revisions\/1687"}],"up":[{"embeddable":true,"href":"https:\/\/www2.whoi.edu\/site\/aomip\/wp-json\/wp\/v2\/pages\/628"}],"wp:attachment":[{"href":"https:\/\/www2.whoi.edu\/site\/aomip\/wp-json\/wp\/v2\/media?parent=782"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}