51 if ( spm_in->
dof > 0 ) {
53 for ( i=0; i<spm_in->
n; i++, l2g_in++ ) {
54 ig = *l2g_in - baseval;
55 jg = ig * ndof + baseval;
56 for ( j=0; j<ndof; j++, l2g_out++ ) {
64 for ( i=0; i<spm_in->
n; i++, l2g_in++ ) {
66 ndof = dofs[ig+1] - dofs[ig];
69 for (j=0; j<ndof; j++, l2g_out++) {
75 assert( (l2g_out - spm_out->
loc2glob) == spm_out->
n );
103 spm_int_t dofi, dofj, col, row, baseval, lda;
105 spm_int_t *newcol, *newrow, *oldcol, *oldrow, *dofs;
106#if !defined(PRECISION_p)
107 double *newval = NULL;
109 double *oldval2, *oldval = NULL;
117#if !defined(PRECISION_p)
118 oldval = oldval2 = (
double *)( spm_in->
values );
121 spm_out->
colptr = newcol = malloc(
sizeof(
spm_int_t ) * ( spm_out->
n + 1 ) );
127 for ( j=0; j<spm_in->
n; j++, oldcol++ ) {
130 dofj = ( spm_in->
dof > 0 ) ? spm_in->
dof : dofs[jg+1] - dofs[jg];
133 newcol[1] = newcol[0];
134 for ( k=oldcol[0]; k<oldcol[1]; k++, oldrow++ ) {
135 ig = *oldrow - baseval;
136 dofi = ( spm_in->
dof > 0 ) ? spm_in->
dof : dofs[ig+1] - dofs[ig];
139 diag = ( diag || ( ig == jg ) );
143 height = newcol[1] - newcol[0];
147 for ( jj=1; jj<dofj; jj++, newcol++ ) {
148 newcol[1] = newcol[0] + height;
158 spm_out->
nnz = newcol[0] - baseval;
160#if !defined( PRECISION_p )
161 spm_out->
values = newval = malloc(
sizeof(
double) * spm_out->
nnz );
170 for ( j=0, col=0; j<spm_in->
n; j++, oldcol++ ) {
175 lda = newcol[1] - newcol[0];
179 if ( spm_in->
dof > 0 ) {
181 assert( col == spm_in->
dof * j );
184 dofj = dofs[jg+1] - dofs[jg];
187 for ( jj=0; jj<dofj; jj++, col++, newcol++ ) {
194 for ( k=oldcol[0]; k<oldcol[1]; k++ ) {
195 ig = oldrow[k-baseval] - baseval;
197 if ( spm_in->
dof > 0 ) {
199 row = spm_in->
dof * ig;
202 dofi = dofs[ig+1] - dofs[ig];
203 row = dofs[ig] - baseval;
209 for ( ii=0; ii<dofi; ii++, row++ ) {
212 ((ig == jg) && (row >= col)) )
214 (*newrow) = row + baseval;
216#if !defined(PRECISION_p)
224 oldval += dofi * (dofj-jj-1);
258 spm_int_t dofi, dofj, col, row, baseval, lda;
260 spm_int_t *newcol, *newrow, *oldcol, *oldrow, *dofs;
261#if !defined(PRECISION_p)
262 double *newval = NULL;
264 double *oldval2, *oldval = NULL;
272#if !defined(PRECISION_p)
273 oldval = oldval2 = (
double*)(spm_in->
values);
282 for ( i=0; i<spm_in->
n; i++, oldrow++ ) {
285 dofi = ( spm_in->
dof > 0 ) ? spm_in->
dof : dofs[ig+1] - dofs[ig];
288 newrow[1] = newrow[0];
289 for ( k=oldrow[0]; k<oldrow[1]; k++, oldcol++ ) {
290 jg = *oldcol - baseval;
291 dofj = (spm_in->
dof > 0 ) ? spm_in->
dof : dofs[jg+1] - dofs[jg];
294 diag = ( diag || ( ig == jg ) );
298 height = newrow[1] - newrow[0];
302 for ( ii=1; ii<dofi; ii++, newrow++ ) {
303 newrow[1] = newrow[0] + height;
313 spm_out->
nnz = newrow[0] - baseval;
315#if !defined(PRECISION_p)
316 spm_out->
values = newval = malloc(
sizeof(
double) * spm_out->
nnz );
325 for ( i=0, row=0; i<spm_in->
n; i++, oldrow++ ) {
330 lda = newrow[1] - newrow[0];
334 if ( spm_in->
dof > 0 ) {
336 assert( row == spm_in->
dof * i );
339 dofi = dofs[ig+1] - dofs[ig];
342 for ( ii=0; ii<dofi; ii++, row++, newrow++ ) {
343 assert( ( ( spm_in->
mtxtype ==
SpmGeneral ) && ( lda == ( newrow[1] - newrow[0] ) ) ) ||
347 oldval = oldval2 + ii;
349 for ( k=oldrow[0]; k<oldrow[1]; k++ ) {
350 jg = oldcol[k-baseval] - baseval;
352 if ( spm_in->
dof > 0 ) {
354 col = spm_in->
dof * jg;
357 dofj = dofs[jg+1] - dofs[jg];
358 col = dofs[jg] - baseval;
361 for ( jj=0; jj<dofj; jj++, col++ ) {
363 ( ( ig == jg ) && ( row <= col ) ) )
365 (*newcol) = col + baseval;
367#if !defined(PRECISION_p)
409 spm_int_t i, j, k, ii, jj, dofi, dofj, col, row, baseval;
410 spm_int_t *newcol, *newrow, *oldcol, *oldrow, *dofs;
411#if !defined(PRECISION_p)
412 double *newval = NULL;
414 double *oldval = NULL;
422#if !defined( PRECISION_p )
423 oldval = (
double *)(spm_in->
values);
434 for ( k=0; k<spm_in->
nnz; k++, oldrow++, oldcol++ ) {
435 i = *oldrow - baseval;
436 j = *oldcol - baseval;
438 if ( spm_in->
dof > 0 ) {
443 dofi = dofs[i+1] - dofs[i];
444 dofj = dofs[j+1] - dofs[j];
448 spm_out->
nnz += dofi * dofj;
451 assert( dofi == dofj );
452 spm_out->
nnz += (dofi * (dofi+1)) / 2;
455 assert( spm_out->
nnz <= spm_in->
nnzexp );
460#if !defined(PRECISION_p)
461 spm_out->
values = newval = malloc(
sizeof(
double) * spm_out->
nnz );
469 for ( k=0; k<spm_in->
nnz; k++, oldrow++, oldcol++ ) {
470 i = *oldrow - baseval;
471 j = *oldcol - baseval;
473 if ( spm_in->
dof > 0 ) {
475 row = spm_in->
dof * i;
477 col = spm_in->
dof * j;
480 dofi = dofs[i+1] - dofs[i];
481 row = dofs[i] - baseval;
482 dofj = dofs[j+1] - dofs[j];
483 col = dofs[j] - baseval;
487 for ( jj=0; jj<dofj; jj++ ) {
488 for ( ii=0; ii<dofi; ii++, oldval+=1 ) {
490 ( ( i == j ) && ( row + ii >= col + jj ) ) )
492 assert( row + ii < spm_out->gNexp );
493 assert( col + jj < spm_out->gNexp );
494 (*newrow) = row + ii + baseval;
495 (*newcol) = col + jj + baseval;
498#if !defined(PRECISION_p)
507 for ( ii=0; ii<dofi; ii++ ) {
508 for ( jj=0; jj<dofj; jj++, oldval+=1 ) {
510 ( ( i == j ) && ( row + ii >= col + jj ) ) )
512 assert( row + ii < spm_out->gNexp );
513 assert( col + jj < spm_out->gNexp );
514 (*newrow) = row + ii + baseval;
515 (*newcol) = col + jj + baseval;
518#if !defined(PRECISION_p)
527 assert( newcol - spm_out->
colptr == spm_out->
nnz );
528 assert( newrow - spm_out->
rowptr == spm_out->
nnz );