35{
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   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
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
  118
  119
  120
  121
  122
  123
  124
  125
  126
  127
  128
  129
  130
  131
  132
  133
  134
  135
  136
  137
  138
  139
  140
  141
  142
  143
  144
  145
  146
  147
  148
  149
  150
  151
  152
  153
  154
  155
  156
  157
  158
  159
  160
  162
  163
  164
  165
  166
  167
  168
  169
  170   *LOW = 1 - NB;
  171   *UPP = MB - 1;
  172 
  173   *LCMT00 = OFFD;
  174 
  175   if( ( M <= 0 ) || ( N <= 0 ) )
  176   {
  177
  178
  179
  180
  181      *IUPP   = ( MRROW ? MB - 1 : ( IMB1 > 0 ? IMB1 - 1 : 0 ) );
  182      *IMBLOC = 0;
  183      *MBLKS  = 0;
  184      *LMBLOC = 0;
  185 
  186      *ILOW   = ( MRCOL ? 1 - NB : ( INB1 > 0 ? 1 - INB1 : 0 ) );
  187      *INBLOC = 0;
  188      *NBLKS  = 0;
  189      *LNBLOC = 0;
  190 
  191      *LCMT00 += ( *LOW - *ILOW + MRCOL * NB ) - ( *IUPP - *UPP + MRROW * MB );
  192 
  193      return;
  194   }
  195 
  196   if( MRROW )
  197   {
  198
  199
  200
  201
  202      *IMBLOC  = 
MIN( M, MB );
 
  203      *IUPP    = MB - 1;
  204      *LCMT00 -= IMB1 - MB + MRROW * MB;
  205      *MBLKS   = ( M - 1 ) / MB + 1;
  206      *LMBLOC  = M - ( M / MB ) * MB;
  207      if( !( *LMBLOC ) ) *LMBLOC = MB;
  208 
  209      if( MRCOL )
  210      {
  211
  212
  213
  214
  215         *INBLOC  = 
MIN( N, NB );
 
  216         *ILOW    = 1 - NB;
  217         *LCMT00 += INB1 - NB + MRCOL * NB;
  218         *NBLKS   = ( N - 1 ) / NB + 1;
  219         *LNBLOC  = N - ( N / NB ) * NB;
  220         if( !( *LNBLOC ) ) *LNBLOC = NB;
  221      }
  222      else
  223      {
  224
  225
  226
  227
  228         *INBLOC = INB1;
  229         *ILOW  = 1 - INB1;
  230         tmp1   = N - INB1;
  231         if( tmp1 )
  232         {
  233
  234
  235
  236
  237            *NBLKS  = ( tmp1 - 1 ) / NB + 2;
  238            *LNBLOC = tmp1 - ( tmp1 / NB ) * NB;
  239            if( !( *LNBLOC ) ) *LNBLOC = NB;
  240         }
  241         else
  242         {
  243
  244
  245
  246            *NBLKS  = 1;
  247            *LNBLOC = INB1;
  248         }
  249      }
  250   }
  251   else
  252   {
  253
  254
  255
  256
  257      *IMBLOC = IMB1;
  258      *IUPP   = IMB1 - 1;
  259      tmp1    = M - IMB1;
  260      if( tmp1 )
  261      {
  262
  263
  264
  265
  266         *MBLKS  = ( tmp1 - 1 ) / MB + 2;
  267         *LMBLOC = tmp1 - ( tmp1 / MB ) * MB;
  268         if( !( *LMBLOC ) ) *LMBLOC = MB;
  269      }
  270      else
  271      {
  272
  273
  274
  275         *MBLKS  = 1;
  276         *LMBLOC = IMB1;
  277      }
  278 
  279      if( MRCOL )
  280      {
  281
  282
  283
  284
  285         *INBLOC  = 
MIN( N, NB );
 
  286         *ILOW    = 1 - NB;
  287         *LCMT00 += INB1 - NB + MRCOL * NB;
  288         *NBLKS   = ( N - 1 ) / NB + 1;
  289         *LNBLOC  = N - ( N / NB ) * NB;
  290         if( !( *LNBLOC ) ) *LNBLOC = NB;
  291      }
  292      else
  293      {
  294
  295
  296
  297
  298         *INBLOC = INB1;
  299         *ILOW   = 1 - INB1;
  300         tmp1    = N - INB1;
  301         if( tmp1 )
  302         {
  303
  304
  305
  306
  307            *NBLKS  = ( tmp1 - 1 ) / NB + 2;
  308            *LNBLOC = tmp1 - ( tmp1 / NB ) * NB;
  309            if( !( *LNBLOC ) ) *LNBLOC = NB;
  310         }
  311         else
  312         {
  313
  314
  315
  316            *NBLKS  = 1;
  317            *LNBLOC = INB1;
  318         }
  319      }
  320   }
  321
  322
  323
  324}