Changeset 3fab862 in tol
- Timestamp:
- Nov 17, 2010, 3:19:45 PM (16 years ago)
- Branches:
- 1941-docker-image-to-test, devel, master
- Children:
- b834312
- Parents:
- 61e1b40
- File:
-
- 1 edited
-
tol/btol/vmatrix_type/vmat.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
tol/btol/vmatrix_type/vmat.cpp
r61e1b40 r3fab862 1378 1378 result = -2; 1379 1379 } 1380 int i, j, k, n, Ak, Bk, Ak1, Bk1; 1381 cholmod_triplet* tr; 1382 int *Ti, *Tj, *Ai, *Ap, *Bi, *Bp; 1383 double *Tx, *Ax, *Bx, *Cx; 1384 int nnz = 0; 1385 double x; 1386 1387 switch(A.code_) { 1388 case(ESC_blasRdense ) : 1389 C.BlasRDense(r,c); 1390 n = A.s_.blasRdense_->nzmax; 1391 Ax = (double*)A.s_.blasRdense_->x; 1392 Bx = (double*)B.s_.blasRdense_->x; 1393 Cx = (double*)C.s_.blasRdense_->x; 1394 for(k=0; k<n; k++) 1395 { 1396 x = f(Ax[k], Bx[k]); 1397 if(x!=0.0) { nnz++; } 1398 Cx[k] = x; 1399 }; 1400 if((Acode==ESC_chlmRsparse) || (Bcode==ESC_chlmRsparse) && (nnz<0.50*r*c)) 1401 { 1402 BVMat C_; 1403 BVMat::bRd2cRs(C_,C); 1404 C = C_; 1405 } 1406 break; 1407 case(ESC_chlmRsparse) : 1408 assert(f00); 1409 C.code_ = ESC_chlmRsparse; 1410 cRs_ensure_packed(A.s_.chlmRsparse_); 1411 cRs_ensure_packed(B.s_.chlmRsparse_); 1412 if(f0x) 1413 { 1414 n = Minimum(A.s_.chlmRsparse_->nzmax,B.s_.chlmRsparse_->nzmax); 1415 } 1416 else 1417 { 1418 n = A.s_.chlmRsparse_->nzmax + B.s_.chlmRsparse_->nzmax; 1419 } 1420 tr=cholmod_allocate_triplet(r,c,n,0,CHOLMOD_REAL,common_); 1421 Ti = (int* )tr->i; 1422 Tj = (int* )tr->j; 1423 Tx = (double*)tr->x; 1424 Ap = (int* )A.s_.chlmRsparse_->p; 1425 Ai = (int* )A.s_.chlmRsparse_->i; 1426 Ax = (double*)A.s_.chlmRsparse_->x; 1427 Bp = (int* )B.s_.chlmRsparse_->p; 1428 Bi = (int* )B.s_.chlmRsparse_->i; 1429 Bx = (double*)B.s_.chlmRsparse_->x; 1430 k = 0; 1431 for(j=0; j<c; j++) 1432 { 1433 Ak = Ap[j]; 1434 Ak1 = Ap[j+1]; 1435 Bk = Bp[j]; 1436 Bk1 = Bp[j+1]; 1437 for(; (Ak<Ak1)||(Bk<Bk1); ) 1380 else 1381 { 1382 int i, j, k, n, Ak, Bk, Ak1, Bk1; 1383 cholmod_triplet* tr; 1384 int *Ti, *Tj, *Ai, *Ap, *Bi, *Bp; 1385 double *Tx, *Ax, *Bx, *Cx; 1386 int nnz = 0; 1387 double x; 1388 1389 switch(A.code_) { 1390 case(ESC_blasRdense ) : 1391 C.BlasRDense(r,c); 1392 n = A.s_.blasRdense_->nzmax; 1393 Ax = (double*)A.s_.blasRdense_->x; 1394 Bx = (double*)B.s_.blasRdense_->x; 1395 Cx = (double*)C.s_.blasRdense_->x; 1396 for(k=0; k<n; k++) 1438 1397 { 1439 if(Ak==Ak1) 1398 x = f(Ax[k], Bx[k]); 1399 if(x!=0.0) { nnz++; } 1400 Cx[k] = x; 1401 }; 1402 if((Acode==ESC_chlmRsparse) || (Bcode==ESC_chlmRsparse) && (nnz<0.50*r*c)) 1403 { 1404 BVMat C_; 1405 BVMat::bRd2cRs(C_,C); 1406 C = C_; 1407 } 1408 break; 1409 case(ESC_chlmRsparse) : 1410 assert(f00); 1411 C.code_ = ESC_chlmRsparse; 1412 cRs_ensure_packed(A.s_.chlmRsparse_); 1413 cRs_ensure_packed(B.s_.chlmRsparse_); 1414 if(f0x) 1415 { 1416 n = Minimum(A.s_.chlmRsparse_->nzmax,B.s_.chlmRsparse_->nzmax); 1417 } 1418 else 1419 { 1420 n = A.s_.chlmRsparse_->nzmax + B.s_.chlmRsparse_->nzmax; 1421 } 1422 tr=cholmod_allocate_triplet(r,c,n,0,CHOLMOD_REAL,common_); 1423 Ti = (int* )tr->i; 1424 Tj = (int* )tr->j; 1425 Tx = (double*)tr->x; 1426 Ap = (int* )A.s_.chlmRsparse_->p; 1427 Ai = (int* )A.s_.chlmRsparse_->i; 1428 Ax = (double*)A.s_.chlmRsparse_->x; 1429 Bp = (int* )B.s_.chlmRsparse_->p; 1430 Bi = (int* )B.s_.chlmRsparse_->i; 1431 Bx = (double*)B.s_.chlmRsparse_->x; 1432 k = 0; 1433 for(j=0; j<c; j++) 1434 { 1435 Ak = Ap[j]; 1436 Ak1 = Ap[j+1]; 1437 Bk = Bp[j]; 1438 Bk1 = Bp[j+1]; 1439 for(; (Ak<Ak1)||(Bk<Bk1); ) 1440 1440 { 1441 if(!f0x) { add_triplet(r,c,n,i=Bi[Bk],j,x=f(0.0,Bx[Bk]),Ti,Tj,Tx,k); } 1442 Bk++; 1441 if(Ak==Ak1) 1442 { 1443 if(!f0x) { add_triplet(r,c,n,i=Bi[Bk],j,x=f(0.0,Bx[Bk]),Ti,Tj,Tx,k); } 1444 Bk++; 1445 } 1446 else if(Bk==Bk1) 1447 { 1448 if(!f0x) { add_triplet(r,c,n,i=Ai[Ak],j,x=f(Ax[Ak],0.0),Ti,Tj,Tx,k); } 1449 Ak++; 1450 } 1451 else if(Ai[Ak]==Bi[Bk]) 1452 { 1453 add_triplet(r,c,n,i=Ai[Ak],j,x=f(Ax[Ak],Bx[Bk]),Ti,Tj,Tx,k); 1454 Ak++; 1455 Bk++; 1456 } 1457 else if(Ai[Ak]>Bi[Bk]) 1458 { 1459 if(!f0x) { add_triplet(r,c,n,i=Bi[Bk],j,x=f(0.0,Bx[Bk]),Ti,Tj,Tx,k); } 1460 Bk++; 1461 } 1462 else //if(Ai[Ak]<Bi[Bk]) 1463 { 1464 if(!f0x) { add_triplet(r,c,n,i=Ai[Ak],j,x=f(Ax[Ak],0.0),Ti,Tj,Tx,k); } 1465 Ak++; 1466 } 1443 1467 } 1444 else if(Bk==Bk1) 1445 { 1446 if(!f0x) { add_triplet(r,c,n,i=Ai[Ak],j,x=f(Ax[Ak],0.0),Ti,Tj,Tx,k); } 1447 Ak++; 1448 } 1449 else if(Ai[Ak]==Bi[Bk]) 1450 { 1451 add_triplet(r,c,n,i=Ai[Ak],j,x=f(Ax[Ak],Bx[Bk]),Ti,Tj,Tx,k); 1452 Ak++; 1453 Bk++; 1454 } 1455 else if(Ai[Ak]>Bi[Bk]) 1456 { 1457 if(!f0x) { add_triplet(r,c,n,i=Bi[Bk],j,x=f(0.0,Bx[Bk]),Ti,Tj,Tx,k); } 1458 Bk++; 1459 } 1460 else //if(Ai[Ak]<Bi[Bk]) 1461 { 1462 if(!f0x) { add_triplet(r,c,n,i=Ai[Ak],j,x=f(Ax[Ak],0.0),Ti,Tj,Tx,k); } 1463 Ak++; 1464 } 1465 } 1466 } 1467 tr->nnz = k; 1468 C.s_.chlmRsparse_ = cholmod_triplet_to_sparse(tr, tr->nnz, common_); 1469 cholmod_free_triplet(&tr, common_); 1470 break; 1471 default: 1472 err_invalid_subtype(fName,A); 1473 result=-3; } 1468 } 1469 tr->nnz = k; 1470 C.s_.chlmRsparse_ = cholmod_triplet_to_sparse(tr, tr->nnz, common_); 1471 cholmod_free_triplet(&tr, common_); 1472 break; 1473 default: 1474 err_invalid_subtype(fName,A); 1475 result=-3; } 1476 }; 1474 1477 if(A__!=&A_) { delete A__; } 1475 1478 if(B__!=&B_) { delete B__; }
Note: See TracChangeset
for help on using the changeset viewer.
