5 &(op , dm,typdim,xm,typexm, dn,typdin,xn,typexn, d,c,
6 & ikle,nelem,nelmax,ndiag)
111 INTEGER,
INTENT(IN) :: NELEM,NELMAX,NDIAG
112 INTEGER,
INTENT(IN) :: IKLE(nelmax,4)
113 CHARACTER(LEN=8),
INTENT(IN) :: OP
114 DOUBLE PRECISION,
INTENT(IN) :: DN(*),D(*),XN(nelmax,*)
115 DOUBLE PRECISION,
INTENT(INOUT) :: DM(*),XM(nelmax,*)
116 CHARACTER(LEN=1),
INTENT(INOUT) :: TYPDIM,TYPEXM,TYPDIN,TYPEXN
117 DOUBLE PRECISION,
INTENT(IN) :: C
125 IF(op(3:8).EQ.
'N ')
THEN 127 IF(typdin(1:1).EQ.
'Q')
THEN 128 CALL ov(
'X=Y ', x=dm, y=dn, dim1=ndiag)
129 ELSEIF(typdin(1:1).EQ.
'I'.OR.typdin(1:1).EQ.
'0')
THEN 132 WRITE(
lu,6) typdin(1:1)
133 6
FORMAT(1x,
'OM2121 (BIEF) : TYPDIN UNKNOWN :',a1)
137 typdim(1:1)=typdin(1:1)
139 IF(typexn(1:1).EQ.
'S')
THEN 141 CALL ov(
'X=Y ', x=xm(1,i), y=xn(1,i), dim1=nelem)
143 ELSEIF(typexn(1:1).EQ.
'Q')
THEN 145 CALL ov(
'X=Y ', x=xm(1,i), y=xn(1,i), dim1=nelem)
147 ELSEIF(typexn(1:1).NE.
'0')
THEN 148 WRITE(
lu,40) typexn(1:1)
149 40
FORMAT(1x,
'OM2121 (BIEF) : TYPEXN UNKNOWN :',a1)
154 typexm(1:1)=typexn(1:1)
158 ELSEIF(op(3:8).EQ.
'TN ')
THEN 160 CALL ov(
'X=Y ', x=dm, y=dn, dim1=ndiag)
162 IF(typexn(1:1).EQ.
'S')
THEN 164 CALL ov(
'X=Y ', x=xm(1,i), y=xn(1,i), dim1=nelem)
166 ELSEIF(typexn(1:1).EQ.
'Q')
THEN 168 CALL ov(
'X=Y ', x=xm(1,i), y=xn(1,i+6), dim1=nelem)
169 CALL ov(
'X=Y ', x=xm(1,i+6), y=xn(1,i), dim1=nelem)
171 ELSEIF(typexn(1:1).NE.
'0')
THEN 172 WRITE(
lu,40) typexn(1:1)
177 typdim(1:1)=typdin(1:1)
178 typexm(1:1)=typexn(1:1)
182 ELSEIF(op(3:8).EQ.
'CN ')
THEN 184 CALL ov(
'X=CY ', x=dm, y=dn, c=c, dim1=ndiag)
186 IF(typexn(1:1).EQ.
'S')
THEN 188 CALL ov(
'X=CY ', x=xm(1,i), y=xn(1,i), c=c, dim1=nelem)
190 ELSEIF(typexn(1:1).EQ.
'Q')
THEN 192 CALL ov(
'X=CY ', x=xm(1,i), y=xn(1,i), c=c, dim1=nelem)
194 ELSEIF(typexn(1:1).NE.
'0')
THEN 195 WRITE(
lu,40) typexn(1:1)
200 typdim(1:1)=typdin(1:1)
201 typexm(1:1)=typexn(1:1)
205 ELSEIF(op(3:8).EQ.
'CM ')
THEN 207 CALL ov(
'X=CX ', x=dm, c=c, dim1=ndiag)
209 IF(typexm(1:1).EQ.
'S')
THEN 211 CALL ov(
'X=CX ', x=xm(1,i), c=c, dim1=nelem)
213 ELSEIF(typexm(1:1).EQ.
'Q')
THEN 215 CALL ov(
'X=CX ', x=xm(1,i), c=c, dim1=nelem)
217 ELSEIF(typexm(1:1).NE.
'0')
THEN 218 WRITE(
lu,40) typexm(1:1)
225 ELSEIF(op(3:8).EQ.
'M+CN ' .OR.
226 & (op(3:8).EQ.
'M+CTN '.AND.typexn(1:1).NE.
'Q') )
THEN 228 IF(typdin(1:1).EQ.
'I')
THEN 229 CALL ov(
'X=X+C ', x=dm, c=c, dim1=ndiag)
230 ELSEIF(typdin(1:1).NE.
'0')
THEN 231 CALL ov(
'X=X+CY ', x=dm, y=dn, c=c, dim1=ndiag)
234 IF(typexn(1:1).EQ.
'S')
THEN 236 CALL ov(
'X=X+CY ', x=xm(1,i), y=xn(1,i), c=c, dim1=nelem)
238 IF(typexm(1:1).EQ.
'Q')
THEN 240 CALL ov(
'X=X+CY ', x=xm(1,i+6), y=xn(1,i), c=c, dim1=nelem)
243 ELSEIF(typexn(1:1).EQ.
'Q')
THEN 244 IF(typexm(1:1).NE.
'Q')
THEN 245 WRITE(
lu,98) typexm(1:1),op(1:8),typexn(1:1)
246 98
FORMAT(1x,
'OM2121 (BIEF) : TYPEXM = ',a1,
' DOES NOT GO ',
247 & /,1x,
'FOR THE OPERATION : ',a8,
' WITH TYPEXN = ',a1)
252 CALL ov(
'X=X+CY ', x=xm(1,i), y=xn(1,i), c=c, dim1=nelem)
254 ELSEIF(typexn(1:1).NE.
'0')
THEN 255 WRITE(
lu,40) typexn(1:1)
262 ELSEIF(op(3:8).EQ.
'M+CTN ')
THEN 266 CALL ov(
'X=X+CY ', x=dm, y=dn, c=c, dim1=ndiag)
268 IF(typexn(1:1).EQ.
'Q')
THEN 269 IF(typexm(1:1).NE.
'Q')
THEN 270 WRITE(
lu,98) typexm(1:1),op(1:8),typexn(1:1)
275 CALL ov(
'X=X+CY ', x=xm(1,i), y=xn(1,i+6), c=c, dim1=nelem)
276 CALL ov(
'X=X+CY ', x=xm(1,i+6), y=xn(1,i ),
280 WRITE(
lu,40) typexn(1:1)
287 ELSEIF(op(3:8).EQ.
'M+N '.OR.
288 & (op(3:8).EQ.
'M+TN ').AND.typexn(1:1).NE.
'Q')
THEN 290 CALL ov(
'X=X+Y ', x=dm, y=dn, dim1=ndiag)
292 IF(typexn(1:1).EQ.
'S')
THEN 294 CALL ov(
'X=X+Y ', x=xm(1,i), y=xn(1,i), dim1=nelem)
296 IF(typexm(1:1).EQ.
'Q')
THEN 298 CALL ov(
'X=X+Y ', x=xm(1,i+6), y=xn(1,i), dim1=nelem)
301 ELSEIF(typexn(1:1).EQ.
'Q')
THEN 302 IF(typexm(1:1).NE.
'Q')
THEN 303 WRITE(
lu,98) typexm(1:1),op(1:8),typexn(1:1)
308 CALL ov(
'X=X+Y ', x=xm(1,i), y=xn(1,i), dim1=nelem)
310 ELSEIF(typexn(1:1).NE.
'0')
THEN 311 WRITE(
lu,40) typexn(1:1)
318 ELSEIF(op(3:8).EQ.
'M+TN ')
THEN 322 CALL ov(
'X=X+Y ', x=dm, y=dn, dim1=ndiag)
324 IF(typexn(1:1).EQ.
'Q')
THEN 325 IF(typexm(1:1).NE.
'Q')
THEN 326 WRITE(
lu,98) typexm(1:1),op(1:8),typexn(1:1)
331 CALL ov(
'X=X+Y ', x=xm(1,i), y=xn(1,i+6), dim1=nelem)
332 CALL ov(
'X=X+Y ', x=xm(1,i+6), y=xn(1,i ), dim1=nelem)
335 WRITE(
lu,40) typexn(1:1)
342 ELSEIF(op(3:8).EQ.
'MD ')
THEN 346 IF(typdim(1:1).EQ.
'Q')
THEN 347 CALL ov(
'X=XY ', x=dm, y=d, dim1=ndiag)
348 ELSEIF(typdim(1:1).EQ.
'I')
THEN 349 CALL ov(
'X=Y ', x=dm, y=d, dim1=ndiag)
351 ELSEIF(typdim(1:1).NE.
'0')
THEN 352 WRITE(
lu,13) typdim(1:1)
360 IF(typexm(1:1).EQ.
'Q')
THEN 364 xm(ielem, 1) = xm(ielem, 1) * d(ikle(ielem,2))
365 xm(ielem, 2) = xm(ielem, 2) * d(ikle(ielem,3))
366 xm(ielem, 3) = xm(ielem, 3) * d(ikle(ielem,4))
368 xm(ielem, 4) = xm(ielem, 4) * d(ikle(ielem,3))
369 xm(ielem, 5) = xm(ielem, 5) * d(ikle(ielem,4))
370 xm(ielem, 6) = xm(ielem, 6) * d(ikle(ielem,4))
372 xm(ielem, 7) = xm(ielem, 7) * d(ikle(ielem,1))
373 xm(ielem, 8) = xm(ielem, 8) * d(ikle(ielem,1))
374 xm(ielem, 9) = xm(ielem, 9) * d(ikle(ielem,1))
376 xm(ielem,10) = xm(ielem,10) * d(ikle(ielem,2))
377 xm(ielem,11) = xm(ielem,11) * d(ikle(ielem,2))
378 xm(ielem,12) = xm(ielem,12) * d(ikle(ielem,3))
382 ELSEIF(typexm(1:1).EQ.
'S')
THEN 385 &
'OM2121 (BIEF) : M=MD NOT AVAILABLE IF M SYMMETRIC')
388 ELSEIF(typexm(1:1).NE.
'0')
THEN 396 ELSEIF(op(3:8).EQ.
'DM ')
THEN 400 IF(typdim(1:1).EQ.
'Q')
THEN 401 CALL ov(
'X=XY ', x=dm, y=d, dim1=ndiag)
402 ELSEIF(typdim(1:1).EQ.
'I')
THEN 403 CALL ov(
'X=Y ', x=dm, y=d, dim1=ndiag)
405 ELSEIF(typdim(1:1).NE.
'0')
THEN 406 WRITE(
lu,13) typdim(1:1)
413 IF(typexm(1:1).EQ.
'Q')
THEN 417 xm(ielem, 7) = xm(ielem, 7) * d(ikle(ielem,2))
418 xm(ielem, 8) = xm(ielem, 8) * d(ikle(ielem,3))
419 xm(ielem, 9) = xm(ielem, 9) * d(ikle(ielem,4))
421 xm(ielem, 1) = xm(ielem, 1) * d(ikle(ielem,1))
422 xm(ielem,10) = xm(ielem,10) * d(ikle(ielem,3))
423 xm(ielem,11) = xm(ielem,11) * d(ikle(ielem,4))
425 xm(ielem, 2) = xm(ielem, 2) * d(ikle(ielem,1))
426 xm(ielem, 4) = xm(ielem, 4) * d(ikle(ielem,2))
427 xm(ielem,12) = xm(ielem,12) * d(ikle(ielem,4))
429 xm(ielem, 3) = xm(ielem, 3) * d(ikle(ielem,1))
430 xm(ielem, 5) = xm(ielem, 5) * d(ikle(ielem,2))
431 xm(ielem, 6) = xm(ielem, 6) * d(ikle(ielem,3))
435 ELSEIF(typexm(1:1).EQ.
'S')
THEN 438 &
'OM2121 (BIEF) : M=MD NOT AVAILABLE IF M SYMMETRIC')
441 ELSEIF(typexm(1:1).NE.
'0')
THEN 443 200
FORMAT(1x,
'OM2121 (BIEF) : TYPEXM NOT AVAILABLE : ',a1)
450 ELSEIF(op(3:8).EQ.
'DMD ')
THEN 454 IF(typdim(1:1).EQ.
'Q')
THEN 455 CALL ov(
'X=XY ', x=dm, y=d, dim1=ndiag)
456 CALL ov(
'X=XY ', x=dm, y=d, dim1=ndiag)
457 ELSEIF(typdim(1:1).EQ.
'I')
THEN 458 CALL ov(
'X=YZ ', x=dm, y=d, z=d, dim1=ndiag)
460 ELSEIF(typdim(1:1).NE.
'0')
THEN 461 WRITE(
lu,13) typdim(1:1)
462 13
FORMAT(1x,
'OM2121 (BIEF) : TYPDIM UNKNOWN :',a1)
469 IF(typexm(1:1).EQ.
'S')
THEN 472 xm(ielem, 1)=xm(ielem, 1) * d(ikle(ielem,2))*d(ikle(ielem,1))
473 xm(ielem, 2)=xm(ielem, 2) * d(ikle(ielem,3))*d(ikle(ielem,1))
474 xm(ielem, 3)=xm(ielem, 3) * d(ikle(ielem,4))*d(ikle(ielem,1))
475 xm(ielem, 4)=xm(ielem, 4) * d(ikle(ielem,3))*d(ikle(ielem,2))
476 xm(ielem, 5)=xm(ielem, 5) * d(ikle(ielem,4))*d(ikle(ielem,2))
477 xm(ielem, 6)=xm(ielem, 6) * d(ikle(ielem,4))*d(ikle(ielem,3))
480 ELSEIF(typexm(1:1).EQ.
'Q')
THEN 483 xm(ielem, 1)=xm(ielem, 1) * d(ikle(ielem,2))*d(ikle(ielem,1))
484 xm(ielem, 2)=xm(ielem, 2) * d(ikle(ielem,3))*d(ikle(ielem,1))
485 xm(ielem, 3)=xm(ielem, 3) * d(ikle(ielem,4))*d(ikle(ielem,1))
486 xm(ielem, 4)=xm(ielem, 4) * d(ikle(ielem,3))*d(ikle(ielem,2))
487 xm(ielem, 5)=xm(ielem, 5) * d(ikle(ielem,4))*d(ikle(ielem,2))
488 xm(ielem, 6)=xm(ielem, 6) * d(ikle(ielem,4))*d(ikle(ielem,3))
489 xm(ielem, 7)=xm(ielem, 7) * d(ikle(ielem,2))*d(ikle(ielem,1))
490 xm(ielem, 8)=xm(ielem, 8) * d(ikle(ielem,3))*d(ikle(ielem,1))
491 xm(ielem, 9)=xm(ielem, 9) * d(ikle(ielem,4))*d(ikle(ielem,1))
492 xm(ielem,10)=xm(ielem,10) * d(ikle(ielem,3))*d(ikle(ielem,2))
493 xm(ielem,11)=xm(ielem,11) * d(ikle(ielem,4))*d(ikle(ielem,2))
494 xm(ielem,12)=xm(ielem,12) * d(ikle(ielem,4))*d(ikle(ielem,3))
497 ELSEIF(typexm(1:1).NE.
'0')
THEN 498 WRITE(
lu,241) typexm(1:1)
499 241
FORMAT(1x,
'OM2121 (BIEF) : TYPEXM UNKNOWN :',a1)
506 ELSEIF(op(3:8).EQ.
'M+D ')
THEN 508 IF(typdim(1:1).EQ.
'Q')
THEN 509 CALL ov(
'X=X+Y ', x=dm, y=d, dim1=ndiag)
511 WRITE(
lu,13) typdim(1:1)
518 ELSEIF(op(3:8).EQ.
'0 ')
THEN 520 CALL ov(
'X=C ', x=dm, c=0.d0, dim1=ndiag)
522 IF(typexm(1:1).EQ.
'S')
THEN 524 CALL ov(
'X=C ', x=xm(1,i), c=0.d0, dim1=nelem)
526 ELSEIF(typexm(1:1).EQ.
'Q')
THEN 528 CALL ov(
'X=C ', x=xm(1,i), c=0.d0, dim1=nelem)
530 ELSEIF(typexm(1:1).NE.
'0')
THEN 531 WRITE(
lu,711) typexm(1:1)
532 711
FORMAT(1x,
'OM2121 (BIEF) : TYPEXM UNKNOWN :',a1)
542 ELSEIF(op(3:8).EQ.
'X(M) ')
THEN 544 IF(typexm(1:1).EQ.
'S')
THEN 545 CALL ov(
'X=Y ', x=xm(1, 7), y=xm(1,1), dim1=nelem)
546 CALL ov(
'X=Y ', x=xm(1, 8), y=xm(1,2), dim1=nelem)
547 CALL ov(
'X=Y ', x=xm(1, 9), y=xm(1,3), dim1=nelem)
548 CALL ov(
'X=Y ', x=xm(1,10), y=xm(1,4), dim1=nelem)
549 CALL ov(
'X=Y ', x=xm(1,11), y=xm(1,5), dim1=nelem)
550 CALL ov(
'X=Y ', x=xm(1,12), y=xm(1,6), dim1=nelem)
551 ELSEIF(typexm(1:1).NE.
'0')
THEN 552 WRITE(
lu,811) typexm(1:1)
553 811
FORMAT(1x,
'OM2121 (BIEF) : MATRIX ALREADY NON SYMMETRICAL: ',
562 ELSEIF(op(3:8).EQ.
'MSK(M)')
THEN 564 IF(typexm(1:1).EQ.
'S')
THEN 566 ELSEIF(typexm(1:1).EQ.
'Q')
THEN 568 ELSEIF(typexm(1:1).EQ.
'0')
THEN 579 CALL ov(
'X=XY ', x=xm(1,i), y=d, dim1=nelem)
588 42
FORMAT(1x,
'OM2121 (BIEF) : UNKNOWN OPERATION : ',a8)
subroutine ov(OP, X, Y, Z, C, DIM1)
subroutine om2121(OP, DM, TYPDIM, XM, TYPEXM, DN, TYPDIN, XN, TYPEXN, D, C, IKLE, NELEM, NELMAX, NDIAG)