1*1e99f302SBen Matthews ! This software is Copyright (c) 2012-2015 The Regents of the 2*1e99f302SBen Matthews ! University of California. All Rights Reserved. 3*1e99f302SBen Matthews ! 4*1e99f302SBen Matthews ! 5*1e99f302SBen Matthews ! Permission to copy and modify this software and its documentation 6*1e99f302SBen Matthews ! for educational, research and non-profit purposes, without fee, 7*1e99f302SBen Matthews ! and without a written agreement is hereby granted, provided that 8*1e99f302SBen Matthews ! the above copyright notice, this paragraph and the following three 9*1e99f302SBen Matthews ! paragraphs appear in all copies. 10*1e99f302SBen Matthews ! 11*1e99f302SBen Matthews ! Permission to make commercial use of this software may be obtained 12*1e99f302SBen Matthews ! by contacting: 13*1e99f302SBen Matthews ! Technology Transfer Office 14*1e99f302SBen Matthews ! 9500 Gilman Drive, Mail Code 0910 15*1e99f302SBen Matthews ! University of California 16*1e99f302SBen Matthews ! La Jolla, CA 92093-0910 17*1e99f302SBen Matthews ! (858) 534-5815 18*1e99f302SBen Matthews ! invent@ucsd.edu 19*1e99f302SBen Matthews ! 20*1e99f302SBen Matthews ! This software program and documentation are copyrighted by The 21*1e99f302SBen Matthews ! Regents of the University of California. The software program and 22*1e99f302SBen Matthews ! documentation are supplied "as is", without any accompanying 23*1e99f302SBen Matthews ! services from The Regents. The Regents does not warrant that the 24*1e99f302SBen Matthews ! operation of the program will be uninterrupted or error-free. The 25*1e99f302SBen Matthews ! end-user understands that the program was developed for research 26*1e99f302SBen Matthews ! purposes and is advised not to rely exclusively on the program for 27*1e99f302SBen Matthews ! any reason. 28*1e99f302SBen Matthews ! 29*1e99f302SBen Matthews ! IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY 30*1e99f302SBen Matthews ! PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL 31*1e99f302SBen Matthews ! DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS 32*1e99f302SBen Matthews ! SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF 33*1e99f302SBen Matthews ! CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 34*1e99f302SBen Matthews ! THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY 35*1e99f302SBen Matthews ! WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 36*1e99f302SBen Matthews ! OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE 37*1e99f302SBen Matthews ! SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE 38*1e99f302SBen Matthews ! UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE 39*1e99f302SBen Matthews ! MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. 40*1e99f302SBen Matthews 41*1e99f302SBen Matthews ! Some defenitions 42*1e99f302SBen Matthews INTEGER, PARAMETER :: LS_TYPE_CG=1, LS_TYPE_GMRES=2, LS_TYPE_NS=3 43*1e99f302SBen Matthews INTEGER, PARAMETER :: BC_TYPE_Dir = 0, BC_TYPE_Neu = 1 44*1e99f302SBen Matthews INTEGER, PARAMETER :: BCOP_TYPE_ADD = 0, BCOP_TYPE_PRE = 1 45*1e99f302SBen Matthews 46*1e99f302SBen Matthews ! Communication structure 47*1e99f302SBen Matthews TYPE svLS_commuType 48*1e99f302SBen Matthews SEQUENCE 49*1e99f302SBen Matthews ! Free of created (USE) 50*1e99f302SBen Matthews LOGICAL :: foC = .FALSE. 51*1e99f302SBen Matthews ! If this the master (USE) 52*1e99f302SBen Matthews LOGICAL :: masF 53*1e99f302SBen Matthews ! Master ID (USE) 54*1e99f302SBen Matthews INTEGER :: master 55*1e99f302SBen Matthews ! ID of this proc. (USE) 56*1e99f302SBen Matthews INTEGER :: task 57*1e99f302SBen Matthews ! Task in FORTRAN indexing (USE) 58*1e99f302SBen Matthews INTEGER :: tF 59*1e99f302SBen Matthews ! Total number of tasks (USE) 60*1e99f302SBen Matthews INTEGER :: nTasks 61*1e99f302SBen Matthews ! MPI communicator (IN) 62*1e99f302SBen Matthews INTEGER :: comm 63*1e99f302SBen Matthews END TYPE svLS_commuType 64*1e99f302SBen Matthews 65*1e99f302SBen Matthews ! LHS matrix related data 66*1e99f302SBen Matthews TYPE svLS_faceType 67*1e99f302SBen Matthews SEQUENCE 68*1e99f302SBen Matthews ! Free or created (USE) 69*1e99f302SBen Matthews LOGICAL :: foC = .FALSE. 70*1e99f302SBen Matthews ! Neu: P/Q coupling (USE) 71*1e99f302SBen Matthews LOGICAL coupledFlag 72*1e99f302SBen Matthews ! Neu: shared between proces (USE) 73*1e99f302SBen Matthews LOGICAL :: sharedFlag = .FALSE. 74*1e99f302SBen Matthews ! Included in the computations (IN) 75*1e99f302SBen Matthews LOGICAL incFlag 76*1e99f302SBen Matthews ! Number of nodes (IN) 77*1e99f302SBen Matthews INTEGER :: nNo = 0 78*1e99f302SBen Matthews ! Degrees of freedom for val (IN) 79*1e99f302SBen Matthews INTEGER :: dof 80*1e99f302SBen Matthews ! Dir/Neu (IN) 81*1e99f302SBen Matthews INTEGER :: bGrp = BC_TYPE_Dir 82*1e99f302SBen Matthews ! Only for data alignment 83*1e99f302SBen Matthews INTEGER :: reserved 84*1e99f302SBen Matthews ! Global node number (IN) 85*1e99f302SBen Matthews INTEGER, ALLOCATABLE :: glob(:) 86*1e99f302SBen Matthews ! ||Sai||**2D0 (USE) 87*1e99f302SBen Matthews REAL*8 nS 88*1e99f302SBen Matthews ! Neu: P = res*Q (IN) 89*1e99f302SBen Matthews REAL*8 :: res = 0D0 90*1e99f302SBen Matthews ! nodal Sai for Neu (IN) 91*1e99f302SBen Matthews REAL*8, ALLOCATABLE :: val(:,:) 92*1e99f302SBen Matthews ! Neu W*Sai (TMP) 93*1e99f302SBen Matthews REAL*8, ALLOCATABLE :: valM(:,:) 94*1e99f302SBen Matthews END TYPE svLS_faceType 95*1e99f302SBen Matthews 96*1e99f302SBen Matthews ! All following are in (USE) 97*1e99f302SBen Matthews TYPE svLS_cSType 98*1e99f302SBen Matthews SEQUENCE 99*1e99f302SBen Matthews ! Pointer to start of data for commu (only 2 proc shared points) 100*1e99f302SBen Matthews INTEGER ptr 101*1e99f302SBen Matthews ! Number of data to be commu (only 2 proc shared points) 102*1e99f302SBen Matthews INTEGER n 103*1e99f302SBen Matthews ! Commu tag 104*1e99f302SBen Matthews INTEGER tag 105*1e99f302SBen Matthews ! Commu req 106*1e99f302SBen Matthews INTEGER req 107*1e99f302SBen Matthews ! Number of blocks for commu (for 3 < proc shared points) 108*1e99f302SBen Matthews INTEGER nBl 109*1e99f302SBen Matthews ! Only for data alignment 110*1e99f302SBen Matthews INTEGER reserved 111*1e99f302SBen Matthews ! Pointer to beggining of each block (for 3 < proc shared points) 112*1e99f302SBen Matthews INTEGER, ALLOCATABLE :: blPtr(:) 113*1e99f302SBen Matthews ! Length of each block (for 3 < proc shared points) 114*1e99f302SBen Matthews INTEGER, ALLOCATABLE :: blN(:) 115*1e99f302SBen Matthews END TYPE svLS_cSType 116*1e99f302SBen Matthews 117*1e99f302SBen Matthews TYPE svLS_lhsType 118*1e99f302SBen Matthews SEQUENCE 119*1e99f302SBen Matthews ! Free of created (USE) 120*1e99f302SBen Matthews LOGICAL :: foC = .FALSE. 121*1e99f302SBen Matthews ! Global number of nodes (IN) 122*1e99f302SBen Matthews INTEGER :: gnNo = 0 123*1e99f302SBen Matthews ! Number of nodes (IN) 124*1e99f302SBen Matthews INTEGER :: nNo = 0 125*1e99f302SBen Matthews ! Number of non-zero in lhs (IN) 126*1e99f302SBen Matthews INTEGER :: nnz = 0 127*1e99f302SBen Matthews ! Number of faces (IN) 128*1e99f302SBen Matthews INTEGER :: nFaces = 0 129*1e99f302SBen Matthews ! nNo of this proc (USE) 130*1e99f302SBen Matthews INTEGER :: mynNo 131*1e99f302SBen Matthews ! Column pointer (USE) 132*1e99f302SBen Matthews INTEGER, ALLOCATABLE :: colPtr(:) 133*1e99f302SBen Matthews ! Row pointer (USE) 134*1e99f302SBen Matthews INTEGER, ALLOCATABLE :: rowPtr(:,:) 135*1e99f302SBen Matthews ! Diagonal pointer (USE) 136*1e99f302SBen Matthews INTEGER, ALLOCATABLE :: diagPtr(:) 137*1e99f302SBen Matthews ! Mapping of nodes (USE) 138*1e99f302SBen Matthews INTEGER, ALLOCATABLE :: map(:) 139*1e99f302SBen Matthews TYPE(svLS_commuType) commu 140*1e99f302SBen Matthews TYPE(svLS_cSType), ALLOCATABLE :: cS(:) 141*1e99f302SBen Matthews TYPE(svLS_faceType), ALLOCATABLE :: face(:) 142*1e99f302SBen Matthews END TYPE svLS_lhsType 143*1e99f302SBen Matthews 144*1e99f302SBen Matthews ! LS related structures 145*1e99f302SBen Matthews TYPE svLS_subLsType 146*1e99f302SBen Matthews SEQUENCE 147*1e99f302SBen Matthews ! Successful solving (OUT) 148*1e99f302SBen Matthews LOGICAL suc 149*1e99f302SBen Matthews ! Maximum iteration (IN) 150*1e99f302SBen Matthews INTEGER mItr 151*1e99f302SBen Matthews ! Space dimension (IN) 152*1e99f302SBen Matthews INTEGER sD 153*1e99f302SBen Matthews ! Number of iteration (OUT) 154*1e99f302SBen Matthews INTEGER itr 155*1e99f302SBen Matthews ! Number of Ax multiply (OUT) 156*1e99f302SBen Matthews INTEGER cM 157*1e99f302SBen Matthews ! Number of |x| norms (OUT) 158*1e99f302SBen Matthews INTEGER cN 159*1e99f302SBen Matthews ! Number of <x.y> dot products (OUT) 160*1e99f302SBen Matthews INTEGER cD 161*1e99f302SBen Matthews ! Only for data alignment (-) 162*1e99f302SBen Matthews INTEGER reserve 163*1e99f302SBen Matthews ! Absolute tolerance (IN) 164*1e99f302SBen Matthews REAL*8 absTol 165*1e99f302SBen Matthews ! Relative tolerance (IN) 166*1e99f302SBen Matthews REAL*8 relTol 167*1e99f302SBen Matthews ! Initial norm of residual (OUT) 168*1e99f302SBen Matthews REAL*8 iNorm 169*1e99f302SBen Matthews ! Final norm of residual (OUT) 170*1e99f302SBen Matthews REAL*8 fNorm 171*1e99f302SBen Matthews ! Res. rduction in last itr. (OUT) 172*1e99f302SBen Matthews REAL*8 dB 173*1e99f302SBen Matthews ! Calling duration (OUT) 174*1e99f302SBen Matthews REAL*8 callD 175*1e99f302SBen Matthews END TYPE svLS_subLsType 176*1e99f302SBen Matthews 177*1e99f302SBen Matthews TYPE svLS_lsType 178*1e99f302SBen Matthews SEQUENCE 179*1e99f302SBen Matthews ! Free of created (USE) 180*1e99f302SBen Matthews LOGICAL :: foC = .FALSE. 181*1e99f302SBen Matthews ! Which one of LS (IN) 182*1e99f302SBen Matthews INTEGER LS_type 183*1e99f302SBen Matthews ! Contribution of mom. res. (OUT) 184*1e99f302SBen Matthews INTEGER Resm 185*1e99f302SBen Matthews ! Contribution of cont. res. (OUT) 186*1e99f302SBen Matthews INTEGER Resc 187*1e99f302SBen Matthews TYPE(svLS_subLsType) GM 188*1e99f302SBen Matthews TYPE(svLS_subLsType) CG 189*1e99f302SBen Matthews TYPE(svLS_subLsType) RI 190*1e99f302SBen Matthews END TYPE svLS_lsType 191