3434**/
3535int CeedOperatorCreateFallback (CeedOperator op ) {
3636 int ierr ;
37+ Ceed fallback_ceed ;
3738
3839 // Check not already created
3940 if (op -> op_fallback ) return CEED_ERROR_SUCCESS ;
4041
4142 // Fallback Ceed
42- const char * resource , * fallback_resource ;
43- ierr = CeedGetResource (op -> ceed , & resource ); CeedChk (ierr );
44- ierr = CeedGetOperatorFallbackResource (op -> ceed , & fallback_resource );
45- CeedChk (ierr );
46- if (!strcmp (resource , fallback_resource ))
47- // LCOV_EXCL_START
48- return CeedError (op -> ceed , CEED_ERROR_UNSUPPORTED ,
49- "Backend %s cannot create an operator"
50- "fallback to resource %s" , resource , fallback_resource );
51- // LCOV_EXCL_STOP
52-
53- // Fallback Ceed
54- if (!op -> ceed -> op_fallback_ceed ) {
55- Ceed ceed_ref ;
56- ierr = CeedInit (fallback_resource , & ceed_ref ); CeedChk (ierr );
57- ceed_ref -> op_fallback_parent = op -> ceed ;
58- ceed_ref -> Error = op -> ceed -> Error ;
59- op -> ceed -> op_fallback_ceed = ceed_ref ;
60- }
43+ ierr = CeedGetOperatorFallbackCeed (op -> ceed , & fallback_ceed ); CeedChk (ierr );
6144
6245 // Clone Op
6346 CeedOperator op_fallback ;
6447 if (op -> is_composite ) {
65- ierr = CeedCompositeOperatorCreate (op -> ceed -> op_fallback_ceed , & op_fallback );
48+ ierr = CeedCompositeOperatorCreate (fallback_ceed , & op_fallback );
6649 CeedChk (ierr );
6750 for (CeedInt i = 0 ; i < op -> num_suboperators ; i ++ ) {
6851 ierr = CeedCompositeOperatorAddSub (op_fallback , op -> sub_operators [i ]);
6952 CeedChk (ierr );
7053 }
7154 } else {
72- ierr = CeedOperatorCreate (op -> ceed -> op_fallback_ceed , op -> qf , op -> dqf , op -> dqfT ,
55+ ierr = CeedOperatorCreate (fallback_ceed , op -> qf , op -> dqf , op -> dqfT ,
7356 & op_fallback ); CeedChk (ierr );
7457 for (CeedInt i = 0 ; i < op -> qf -> num_input_fields ; i ++ ) {
7558 ierr = CeedOperatorSetField (op_fallback , op -> input_fields [i ]-> field_name ,
@@ -500,11 +483,11 @@ static int CeedSingleOperatorAssembleSymbolic(CeedOperator op, CeedInt offset,
500483
501484 // Determine i, j locations for element matrices
502485 CeedInt count = 0 ;
503- for (int e = 0 ; e < num_elem ; ++ e ) {
504- for (int comp_in = 0 ; comp_in < num_comp ; ++ comp_in ) {
505- for (int comp_out = 0 ; comp_out < num_comp ; ++ comp_out ) {
506- for (int i = 0 ; i < elem_size ; ++ i ) {
507- for (int j = 0 ; j < elem_size ; ++ j ) {
486+ for (CeedInt e = 0 ; e < num_elem ; ++ e ) {
487+ for (CeedInt comp_in = 0 ; comp_in < num_comp ; ++ comp_in ) {
488+ for (CeedInt comp_out = 0 ; comp_out < num_comp ; ++ comp_out ) {
489+ for (CeedInt i = 0 ; i < elem_size ; ++ i ) {
490+ for (CeedInt j = 0 ; j < elem_size ; ++ j ) {
508491 const CeedInt elem_dof_index_row = (i )* layout_er [0 ] +
509492 (comp_out )* layout_er [1 ] + e * layout_er [2 ];
510493 const CeedInt elem_dof_index_col = (j )* layout_er [0 ] +
@@ -685,31 +668,32 @@ static int CeedSingleOperatorAssemble(CeedOperator op, CeedInt offset,
685668 num_qpts ]; // logically 3-tensor
686669 CeedScalar BTD [elem_size * num_qpts * num_eval_mode_in ];
687670 CeedScalar elem_mat [elem_size * elem_size ];
688- int count = 0 ;
671+ CeedInt count = 0 ;
689672 CeedScalar * vals ;
690673 ierr = CeedVectorGetArrayWrite (values , CEED_MEM_HOST , & vals ); CeedChk (ierr );
691- for (int e = 0 ; e < num_elem ; ++ e ) {
692- for (int comp_in = 0 ; comp_in < num_comp ; ++ comp_in ) {
693- for (int comp_out = 0 ; comp_out < num_comp ; ++ comp_out ) {
694- for (int ell = 0 ; ell < (num_qpts * num_eval_mode_in ) * elem_size ; ++ ell ) {
674+ for (CeedInt e = 0 ; e < num_elem ; ++ e ) {
675+ for (CeedInt comp_in = 0 ; comp_in < num_comp ; ++ comp_in ) {
676+ for (CeedInt comp_out = 0 ; comp_out < num_comp ; ++ comp_out ) {
677+ for (CeedInt ell = 0 ; ell < (num_qpts * num_eval_mode_in ) * elem_size ; ++ ell ) {
695678 B_mat_in [ell ] = 0.0 ;
696679 }
697- for (int ell = 0 ; ell < (num_qpts * num_eval_mode_out ) * elem_size ; ++ ell ) {
680+ for (CeedInt ell = 0 ; ell < (num_qpts * num_eval_mode_out ) * elem_size ; ++ ell ) {
698681 B_mat_out [ell ] = 0.0 ;
699682 }
700683 // Store block-diagonal D matrix as collection of small dense blocks
701- for (int ell = 0 ; ell < num_eval_mode_in * num_eval_mode_out * num_qpts ; ++ ell ) {
684+ for (CeedInt ell = 0 ; ell < num_eval_mode_in * num_eval_mode_out * num_qpts ;
685+ ++ ell ) {
702686 D_mat [ell ] = 0.0 ;
703687 }
704688 // form element matrix itself (for each block component)
705- for (int ell = 0 ; ell < elem_size * elem_size ; ++ ell ) {
689+ for (CeedInt ell = 0 ; ell < elem_size * elem_size ; ++ ell ) {
706690 elem_mat [ell ] = 0.0 ;
707691 }
708- for (int q = 0 ; q < num_qpts ; ++ q ) {
709- for (int n = 0 ; n < elem_size ; ++ n ) {
692+ for (CeedInt q = 0 ; q < num_qpts ; ++ q ) {
693+ for (CeedInt n = 0 ; n < elem_size ; ++ n ) {
710694 CeedInt d_in = -1 ;
711- for (int e_in = 0 ; e_in < num_eval_mode_in ; ++ e_in ) {
712- const int qq = num_eval_mode_in * q ;
695+ for (CeedInt e_in = 0 ; e_in < num_eval_mode_in ; ++ e_in ) {
696+ const CeedInt qq = num_eval_mode_in * q ;
713697 if (eval_mode_in [e_in ] == CEED_EVAL_INTERP ) {
714698 B_mat_in [(qq + e_in )* elem_size + n ] += interp_in [q * elem_size + n ];
715699 } else if (eval_mode_in [e_in ] == CEED_EVAL_GRAD ) {
@@ -723,8 +707,8 @@ static int CeedSingleOperatorAssemble(CeedOperator op, CeedInt offset,
723707 }
724708 }
725709 CeedInt d_out = -1 ;
726- for (int e_out = 0 ; e_out < num_eval_mode_out ; ++ e_out ) {
727- const int qq = num_eval_mode_out * q ;
710+ for (CeedInt e_out = 0 ; e_out < num_eval_mode_out ; ++ e_out ) {
711+ const CeedInt qq = num_eval_mode_out * q ;
728712 if (eval_mode_out [e_out ] == CEED_EVAL_INTERP ) {
729713 B_mat_out [(qq + e_out )* elem_size + n ] += interp_in [q * elem_size + n ];
730714 } else if (eval_mode_out [e_out ] == CEED_EVAL_GRAD ) {
@@ -738,25 +722,26 @@ static int CeedSingleOperatorAssemble(CeedOperator op, CeedInt offset,
738722 }
739723 }
740724 }
741- for (int ei = 0 ; ei < num_eval_mode_out ; ++ ei ) {
742- for (int ej = 0 ; ej < num_eval_mode_in ; ++ ej ) {
743- const int eval_mode_index = ((ei * num_comp + comp_in )* num_eval_mode_in + ej )* num_comp
744- + comp_out ;
745- const int index = q * layout_qf [0 ] + eval_mode_index * layout_qf [1 ] +
746- e * layout_qf [2 ];
725+ for (CeedInt ei = 0 ; ei < num_eval_mode_out ; ++ ei ) {
726+ for (CeedInt ej = 0 ; ej < num_eval_mode_in ; ++ ej ) {
727+ const CeedInt eval_mode_index = ((ei * num_comp + comp_in )* num_eval_mode_in + ej )
728+ * num_comp
729+ + comp_out ;
730+ const CeedInt index = q * layout_qf [0 ] + eval_mode_index * layout_qf [1 ] +
731+ e * layout_qf [2 ];
747732 D_mat [(ei * num_eval_mode_in + ej )* num_qpts + q ] += assembled_qf_array [index ];
748733 }
749734 }
750735 }
751736 // Compute B^T*D
752- for (int ell = 0 ; ell < elem_size * num_qpts * num_eval_mode_in ; ++ ell ) {
737+ for (CeedInt ell = 0 ; ell < elem_size * num_qpts * num_eval_mode_in ; ++ ell ) {
753738 BTD [ell ] = 0.0 ;
754739 }
755- for (int j = 0 ; j < elem_size ; ++ j ) {
756- for (int q = 0 ; q < num_qpts ; ++ q ) {
757- int qq = num_eval_mode_out * q ;
758- for (int ei = 0 ; ei < num_eval_mode_in ; ++ ei ) {
759- for (int ej = 0 ; ej < num_eval_mode_out ; ++ ej ) {
740+ for (CeedInt j = 0 ; j < elem_size ; ++ j ) {
741+ for (CeedInt q = 0 ; q < num_qpts ; ++ q ) {
742+ const CeedInt qq = num_eval_mode_out * q ;
743+ for (CeedInt ei = 0 ; ei < num_eval_mode_in ; ++ ei ) {
744+ for (CeedInt ej = 0 ; ej < num_eval_mode_out ; ++ ej ) {
760745 BTD [j * (num_qpts * num_eval_mode_in ) + (qq + ei )] +=
761746 B_mat_out [(qq + ej )* elem_size + j ] * D_mat [(ei * num_eval_mode_in + ej )* num_qpts + q ];
762747 }
@@ -768,8 +753,8 @@ static int CeedSingleOperatorAssemble(CeedOperator op, CeedInt offset,
768753 elem_size , num_qpts * num_eval_mode_in ); CeedChk (ierr );
769754
770755 // put element matrix in coordinate data structure
771- for (int i = 0 ; i < elem_size ; ++ i ) {
772- for (int j = 0 ; j < elem_size ; ++ j ) {
756+ for (CeedInt i = 0 ; i < elem_size ; ++ i ) {
757+ for (CeedInt j = 0 ; j < elem_size ; ++ j ) {
773758 vals [offset + count ] = elem_mat [i * elem_size + j ];
774759 count ++ ;
775760 }
@@ -861,7 +846,7 @@ static int CeedSingleOperatorMultigridLevel(CeedOperator op_fine,
861846 op_coarse ); CeedChk (ierr );
862847 CeedElemRestriction rstr_fine = NULL ;
863848 // -- Clone input fields
864- for (int i = 0 ; i < op_fine -> qf -> num_input_fields ; i ++ ) {
849+ for (CeedInt i = 0 ; i < op_fine -> qf -> num_input_fields ; i ++ ) {
865850 if (op_fine -> input_fields [i ]-> vec == CEED_VECTOR_ACTIVE ) {
866851 rstr_fine = op_fine -> input_fields [i ]-> elem_restr ;
867852 ierr = CeedOperatorSetField (* op_coarse , op_fine -> input_fields [i ]-> field_name ,
@@ -875,7 +860,7 @@ static int CeedSingleOperatorMultigridLevel(CeedOperator op_fine,
875860 }
876861 }
877862 // -- Clone output fields
878- for (int i = 0 ; i < op_fine -> qf -> num_output_fields ; i ++ ) {
863+ for (CeedInt i = 0 ; i < op_fine -> qf -> num_output_fields ; i ++ ) {
879864 if (op_fine -> output_fields [i ]-> vec == CEED_VECTOR_ACTIVE ) {
880865 ierr = CeedOperatorSetField (* op_coarse , op_fine -> output_fields [i ]-> field_name ,
881866 rstr_coarse , basis_coarse , CEED_VECTOR_ACTIVE );
@@ -1722,7 +1707,7 @@ int CeedOperatorLinearAssembleSymbolic(CeedOperator op, CeedSize *num_entries,
17221707 if (is_composite ) {
17231708 ierr = CeedOperatorGetNumSub (op , & num_suboperators ); CeedChk (ierr );
17241709 ierr = CeedOperatorGetSubList (op , & sub_operators ); CeedChk (ierr );
1725- for (int k = 0 ; k < num_suboperators ; ++ k ) {
1710+ for (CeedInt k = 0 ; k < num_suboperators ; ++ k ) {
17261711 ierr = CeedSingleOperatorAssemblyCountEntries (sub_operators [k ],
17271712 & single_entries ); CeedChk (ierr );
17281713 * num_entries += single_entries ;
@@ -1740,7 +1725,7 @@ int CeedOperatorLinearAssembleSymbolic(CeedOperator op, CeedSize *num_entries,
17401725 if (is_composite ) {
17411726 ierr = CeedOperatorGetNumSub (op , & num_suboperators ); CeedChk (ierr );
17421727 ierr = CeedOperatorGetSubList (op , & sub_operators ); CeedChk (ierr );
1743- for (int k = 0 ; k < num_suboperators ; ++ k ) {
1728+ for (CeedInt k = 0 ; k < num_suboperators ; ++ k ) {
17441729 ierr = CeedSingleOperatorAssembleSymbolic (sub_operators [k ], offset , * rows ,
17451730 * cols ); CeedChk (ierr );
17461731 ierr = CeedSingleOperatorAssemblyCountEntries (sub_operators [k ],
@@ -1812,7 +1797,7 @@ int CeedOperatorLinearAssemble(CeedOperator op, CeedVector values) {
18121797 if (is_composite ) {
18131798 ierr = CeedOperatorGetNumSub (op , & num_suboperators ); CeedChk (ierr );
18141799 ierr = CeedOperatorGetSubList (op , & sub_operators ); CeedChk (ierr );
1815- for (int k = 0 ; k < num_suboperators ; ++ k ) {
1800+ for (CeedInt k = 0 ; k < num_suboperators ; ++ k ) {
18161801 ierr = CeedSingleOperatorAssemble (sub_operators [k ], offset , values );
18171802 CeedChk (ierr );
18181803 ierr = CeedSingleOperatorAssemblyCountEntries (sub_operators [k ],
@@ -1893,14 +1878,16 @@ int CeedOperatorMultigridLevelCreate(CeedOperator op_fine,
18931878 ierr = CeedMalloc (Q * P_c , & interp_c ); CeedChk (ierr );
18941879 ierr = CeedCalloc (P_c * P_f , & interp_c_to_f ); CeedChk (ierr );
18951880 ierr = CeedMalloc (Q , & tau ); CeedChk (ierr );
1881+ const CeedScalar * interp_f_source = NULL , * interp_c_source = NULL ;
18961882 if (is_tensor_f ) {
1897- memcpy (interp_f , basis_fine -> interp_1d , Q * P_f * sizeof basis_fine -> interp_1d [0 ]);
1898- memcpy (interp_c , basis_coarse -> interp_1d ,
1899- Q * P_c * sizeof basis_coarse -> interp_1d [0 ]);
1883+ ierr = CeedBasisGetInterp1D (basis_fine , & interp_f_source ); CeedChk (ierr );
1884+ ierr = CeedBasisGetInterp1D (basis_coarse , & interp_c_source ); CeedChk (ierr );
19001885 } else {
1901- memcpy ( interp_f , basis_fine -> interp , Q * P_f * sizeof basis_fine -> interp [ 0 ] );
1902- memcpy ( interp_c , basis_coarse -> interp , Q * P_c * sizeof basis_coarse -> interp [ 0 ] );
1886+ ierr = CeedBasisGetInterp ( basis_fine , & interp_f_source ); CeedChk ( ierr );
1887+ ierr = CeedBasisGetInterp ( basis_coarse , & interp_c_source ); CeedChk ( ierr );
19031888 }
1889+ memcpy (interp_f , interp_f_source , Q * P_f * sizeof interp_f_source [0 ]);
1890+ memcpy (interp_c , interp_c_source , Q * P_c * sizeof interp_c_source [0 ]);
19041891
19051892 // -- QR Factorization, interp_f = Q R
19061893 ierr = CeedQRFactorization (ceed , interp_f , tau , Q , P_f ); CeedChk (ierr );
0 commit comments