Changeset 3fab862 in tol


Ignore:
Timestamp:
Nov 17, 2010, 3:19:45 PM (16 years ago)
Author:
Víctor de Buen <vdebuen@…>
Branches:
1941-docker-image-to-test, devel, master
Children:
b834312
Parents:
61e1b40
Message:

Fixes #1012

git-svn-id: ​https://www.tol-project.org/svn/tolp/trunk@2680 be4846ae-f051-483a-831f-b64e7d08527f

File:
1 edited

Legend:

Unmodified
Added
Removed
  • tol/btol/vmatrix_type/vmat.cpp

    r61e1b40 r3fab862  
    13781378    result = -2;
    13791379  }
    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++)
    14381397      {
    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); )
    14401440        {
    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          }
    14431467        }
    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  };
    14741477  if(A__!=&A_) { delete A__; }
    14751478  if(B__!=&B_) { delete B__; }
Note: See TracChangeset for help on using the changeset viewer.