Example #1
0
int main(){
  TTableContext Context;
  // create scheme
  Schema AnimalS;
  AnimalS.Add(TPair<TStr,TAttrType>("Animal", atStr));
  AnimalS.Add(TPair<TStr,TAttrType>("Size", atStr));
  AnimalS.Add(TPair<TStr,TAttrType>("Location", atStr));
  AnimalS.Add(TPair<TStr,TAttrType>("Number", atInt));
  TIntV RelevantCols;
  RelevantCols.Add(0);
  RelevantCols.Add(1);
  RelevantCols.Add(2);
  // create table
  PTable T = TTable::LoadSS("Animals", AnimalS, "tests/animals.txt", Context, RelevantCols);
  //PTable T = TTable::LoadSS("Animals", AnimalS, "animals.txt");
  T->Unique("Animal");
  TTable Ts = *T;  // did we fix problem with copy-c'tor ?
  //PTable Ts = TTable::LoadSS("Animals_s", AnimalS, "../../testfiles/animals.txt", RelevantCols);
  //Ts->Unique(AnimalUnique);

  // test Select
  // create predicate tree: find all animals that are big and african or medium and Australian
  TPredicate::TAtomicPredicate A1(atStr, true, EQ, "Location", "", 0, 0, "Africa");  
  TPredicate::TPredicateNode N1(A1);  // Location == "Africa"
  TPredicate::TAtomicPredicate A2(atStr, true, EQ, "Size", "", 0, 0, "big");  
  TPredicate::TPredicateNode N2(A2);  // Size == "big"
  TPredicate::TPredicateNode N3(AND);
  N3.AddLeftChild(&N1);
  N3.AddRightChild(&N2);
  TPredicate::TAtomicPredicate A4(atStr, true, EQ, "Location", "", 0, 0, "Australia");  
  TPredicate::TPredicateNode N4(A4);  
  TPredicate::TAtomicPredicate A5(atStr, true, EQ, "Size", "", 0, 0, "medium");  
  TPredicate::TPredicateNode N5(A5); 
  TPredicate::TPredicateNode N6(AND);
  N6.AddLeftChild(&N4);
  N6.AddRightChild(&N5);
  TPredicate::TPredicateNode N7(OR);
  N7.AddLeftChild(&N3);
  N7.AddRightChild(&N6);
  TPredicate Pred(&N7);
  TIntV SelectedRows;
  Ts.Select(Pred, SelectedRows);

  TStrV GroupBy;
  GroupBy.Add("Location");
  T->Group(GroupBy, "LocationGroup");
  GroupBy.Add("Size");
  T->Group(GroupBy, "LocationSizeGroup");
  T->Count("LocationCount", "Location");
  PTable Tj = T->Join("Location", Ts, "Location");
  TStrV UniqueAnimals;
  UniqueAnimals.Add("Animals_1.Animal");
  UniqueAnimals.Add("Animals_2.Animal");
  Tj->Unique(UniqueAnimals, false);
  //print table
   T->SaveSS("tests/animals_out_T.txt");
   Ts.SaveSS("tests/animals_out_Ts.txt");
   Tj->SaveSS("tests/animals_out_Tj.txt");
  return 0;
}
Example #2
0
		std::string makeFormattedString(
		const char* aFormat,
		const A1& a1 = A1(),
		const A2& a2 = A2(),
		const A3& a3 = A3(),
		const A4& a4 = A4(),
		const A5& a5 = A5(),
		const A6& a6 = A6(),
		const A7& a7 = A7(),
		const A8& a8 = A8(),
		const A9& a9 = A9(),
		const A10& a10 = A10(),
		const A11& a11 = A11(),
		const A12& a12 = A12(),
		const A13& a13 = A13(),
		const A14& a14 = A14(),
		const A15& a15 = A15(),
		const A16& a16 = A16(),
		const A17& a17 = A17(),
		const A18& a18 = A18(),
		const A19& a19 = A19(),
		const A20& a20 = A20()
		)
		{
			return makeStringByPrintf(aFormat,
				a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,
				a11, a12, a13, a14, a15, a16, a17, a18, a19, a20
				);
		}
Example #3
0
int main(void)
{
	A4();

	printf("\n\n\nProgramm Ende! Enter Druecken...");
	fflush(stdin);
	getc(stdin);

	return 0;
}
int hpx_main(boost::program_options::variables_map& vm)
{
    {
        orthotope<double>
            A0({3, 3})
          , A1({3, 3})
          , A2({3, 3})  
          , A3({3, 3})
          , A4({3, 3})
          , A5({4, 4})
            ;
    
        // QR {{1, 3, 6}, {3, 5, 7}, {6, 7, 4}}
        A0.row(0,  1,    3,    6   );
        A0.row(1,  3,    5,    7   );
        A0.row(2,  6,    7,    4   );
    
        // QR {{12, -51, 4}, {6, 167, -68}, {-4, 24, -41}}
        A1.row(0,  12,  -51,   4   );
        A1.row(1,  6,    167, -68  );
        A1.row(2, -4,    24,  -41  );
 
        // QR {{2, -2, 18}, {2, 1, 0}, {1, 2, 0}}
        A2.row(0,  2,   -2,    18  );
        A2.row(1,  2,    1,    0   );
        A2.row(2,  1,    2,    0   );
   
        // QR {{0, 1, 1}, {1, 1, 2}, {0, 0, 3}}
        A3.row(0,  0,    1,    1   );
        A3.row(1,  1,    1,    2   );
        A3.row(2,  0,    0,    3   );

        // QR {{1, 1, -1}, {1, 2, 1}, {1, 2, -1}}
        A4.row(0,  1,    1,   -1   );
        A4.row(1,  1,    2,    1   );
        A4.row(2,  1,    2,   -1   );
    
        // QR {{4, -2, 2, 8}, {-2, 6, 2, 4}, {2, 2, 10, -6}, {8, 4, -6, 12}}
        A5.row(0,  4,   -2,    2,    8   );
        A5.row(1, -2,    6,    2,    4   );
        A5.row(2,  2,    2,    10,  -6   );
        A5.row(3,  8,    4,   -6,    12  );
    
        householders(A0);
        householders(A1);
        householders(A2);
        householders(A3);
        householders(A4);
        householders(A5);
    }

    return hpx::finalize(); 
}
Example #5
0
Array4d Analysis::getNumberDensity(const bool total) {

    for(int s = NsLlD; s <= NsLuD; s++) {

    const double d6Z = scaleXYZV * plasma->B0 * M_PI;

    for(int x=NxLlD; x<= NxLuD;x++) { for(int y=NkyLlD; y<= NkyLuD;y++) { for(int z=NzLlD; z<= NzLuD;z++){

       A4(x,y,z,s) = abs(F(x, y, z, RvLD, RmLD, s))*d6Z;

    }}} } 

    return parallel->collect(A4, OP_SUM, DIR_VM);

};
Example #6
0
  TypeOfFE_Lagrange(int k):
    //              dfon ,N,nsub(graphique) ,  const mat interpolation , discontinuous 
    GTypeOfFE<Mesh>(A4(k),1,k==-1?-1:Max(k,1),k<=2,k==0)
  {
    int n=this->NbDoF;
    if(verbosity>9)    
    cout << "\n +++ P"<<k<<" : ndof : "<< n <<endl;
    SetPtPk<RdHat,Element> (this->PtInterpolation,this->ndfOn(),this->NbDoF);
    if(verbosity>9)    cout << this->PtInterpolation<< endl;
    for (int i=0;i<n;i++) 
      {
	this->pInterpolation[i]=i;
	this->cInterpolation[i]=0;
	this->dofInterpolation[i]=i;
	this->coefInterpolation[i]=1.;
      }
  }
Example #7
0
int main()
{
	int n = 0, a1 = 0, a2 = 0, a3 = 0, a4 = 0, a5 = 0, num = 0;
	int count_a1 = 0, count_a2 = 0, count_a3 = 0, count_a4 = 0, count_a5 = 0;
	int flag_A2 = 1;

	scanf("%d", &n);
	for (; n > 0; n--) {
		scanf("%d", &num);
		A1(num, &a1, &count_a1);
		A2(num, &a2, &count_a2, &flag_A2);
		A3(num, &a3, &count_a3);
		A4(num, &a4, &count_a4);
		A5(num, &a5, &count_a5);
	}
	if (count_a1 > 0)
		printf("%d ", a1);
	else
		printf("N ");

	if (count_a2 > 0)
		printf("%d ", a2);
	else
		printf("N ");

	if (count_a3 > 0)
		printf("%d ", a3);
	else
		printf("N ");

	if (count_a4 > 0)
		printf("%.1lf ", (double)a4 / count_a4);
	else
		printf("N ");

	if (count_a5 > 0)
		printf("%d", a5);
	else
		printf("N");

	return 0;
}
Example #8
0
	int test()
	{
		int Error(0);

		{
			float A0(3.0);
			float B0(2.0f);
			float C0 = glm::fmod(A0, B0);

			Error += glm::abs(C0 - 1.0f) < 0.00001f ? 0 : 1;

			glm::vec4 A1(3.0);
			float B1(2.0f);
			glm::vec4 C1 = glm::fmod(A1, B1);

			Error += glm::all(glm::epsilonEqual(C1, glm::vec4(1.0f), 0.00001f)) ? 0 : 1;

			glm::vec4 A2(3.0);
			glm::vec4 B2(2.0f);
			glm::vec4 C2 = glm::fmod(A2, B2);

			Error += glm::all(glm::epsilonEqual(C2, glm::vec4(1.0f), 0.00001f)) ? 0 : 1;

			glm::ivec4 A3(3);
			int B3(2);
			glm::ivec4 C3 = glm::fmod(A3, B3);

			Error += glm::all(glm::equal(C3, glm::ivec4(1))) ? 0 : 1;

			glm::ivec4 A4(3);
			glm::ivec4 B4(2);
			glm::ivec4 C4 = glm::fmod(A4, B4);

			Error += glm::all(glm::equal(C4, glm::ivec4(1))) ? 0 : 1;
		}

		{
			float A0(22.0);
			float B0(-10.0f);
			float C0 = glm::fmod(A0, B0);

			Error += glm::abs(C0 - 2.0f) < 0.00001f ? 0 : 1;

			glm::vec4 A1(22.0);
			float B1(-10.0f);
			glm::vec4 C1 = glm::fmod(A1, B1);

			Error += glm::all(glm::epsilonEqual(C1, glm::vec4(2.0f), 0.00001f)) ? 0 : 1;

			glm::vec4 A2(22.0);
			glm::vec4 B2(-10.0f);
			glm::vec4 C2 = glm::fmod(A2, B2);

			Error += glm::all(glm::epsilonEqual(C2, glm::vec4(2.0f), 0.00001f)) ? 0 : 1;

			glm::ivec4 A3(22);
			int B3(-10);
			glm::ivec4 C3 = glm::fmod(A3, B3);

			Error += glm::all(glm::equal(C3, glm::ivec4(2))) ? 0 : 1;

			glm::ivec4 A4(22);
			glm::ivec4 B4(-10);
			glm::ivec4 C4 = glm::fmod(A4, B4);

			Error += glm::all(glm::equal(C4, glm::ivec4(2))) ? 0 : 1;
		}

		// http://stackoverflow.com/questions/7610631/glsl-mod-vs-hlsl-fmod
		{
			for (float y = -10.0f; y < 10.0f; y += 0.1f)
			for (float x = -10.0f; x < 10.0f; x += 0.1f)
			{
				float const A(std::fmod(x, y));
				//float const B(std::remainder(x, y));
				float const C(glm::fmod(x, y));
				float const D(modTrunc(x, y));

				//Error += glm::epsilonEqual(A, B, 0.0001f) ? 0 : 1;
				//assert(!Error);
				Error += glm::epsilonEqual(A, C, 0.0001f) ? 0 : 1;
				assert(!Error);
				Error += glm::epsilonEqual(A, D, 0.00001f) ? 0 : 1;
				assert(!Error);
			}
		}

		return Error;
	}
Example #9
0
int main(int argc, char** argv) {
	const int TARIFFA = 2;
	
	Autovettura A1("bj066mx", "benzina", "suv", 6);
	Autovettura A2("kt887gg", "gpl", "monovolume", 5);
	Autovettura A3("dh572xc", "metano", "berlina", 5);
	Autovettura A4("mq111nd", "diesel", "utilitaria", 4);
	Autobus A5("cc789oi", "benzina", "bus", 50, "Milano", 200);
	Autobus A6("st230ks", "gpl", "bus", 50, "Roma", 300);
	Autobus A7("vv234sd", "metano", "bus", 25, "Napoli", 100);
	Autobus A8("we785ss", "diesel", "bus", 60, "Parma", 400);
	
	Autoveicolo * v[8];
	v[0] = &A1;
	v[1] = &A2;
	v[2] = &A3;
	v[3] = &A4;
	v[4] = &A5;
	v[5] = &A6;
	v[6] = &A7;
	v[7] = &A8;
	
	cout<<"Polimorfismo:\n";
	for(int i=0; i<8; i++) {
		v[i]->stampaDati();
		cout << "\n";
	}
	
	
	Coda C1, C2, C3;
	C1.append(&A1);
	C1.append(&A2);
	C1.append(&A3);
	C1.append(&A4);
	C1.append(&A5);
	C1.append(&A6);
	C1.append(&A7);
	C1.append(&A8);
	
	C2.append(&A1);
	C2.append(&A2);
	C2.append(&A3);
	C2.append(&A4);
	C2.append(&A5);
	C2.append(&A6);
	C2.append(&A7);
	
	C3.append(&A1);
	C3.append(&A2);
	C3.append(&A3);
	C3.append(&A4);
	C3.append(&A5);
	C3.append(&A6);
	
	
	
	cout<<"\n\n\nCoda1:\n";
	cout<<C1;
	cout<<"\n\n\nCoda2:\n";
	cout<<C2;
	cout<<"\n\n\nCoda3:\n";
	cout<<C3;
	cout<<"\n\n\n";
	
	int e1, e2, e3;
	e1 = C1.getNelem();
	e2 = C2.getNelem();
	e3 = C3.getNelem();
	
	for(int i = 0; i<e1; i++) {
		Autoveicolo * elem;
		C1.pop(elem, TARIFFA); 
		cout<<"Elemento rimosso -> ";
		elem->stampaDati();
		cout<<endl;
	}
	cout<<"\n\n\n";
	for(int i = 0; i<e2; i++) {
		Autoveicolo * elem;
		C2.pop(elem, TARIFFA); 
		cout<<"Elemento rimosso -> ";
		elem->stampaDati();
		cout<<endl;
	}
	cout<<"\n\n\n";
	for(int i = 0; i<e3; i++) {
		Autoveicolo * elem;
		C3.pop(elem, TARIFFA); 
		cout<<"Elemento rimosso -> ";
		elem->stampaDati();
		cout<<endl;
	}
	if(C1.getIncasso()>100) {
		cout<<"\n\n\nIncasso totale: "<<C1.getIncasso()<< " bombe!";
	} else {
		cout<<"\n\n\nIncasso totale: "<<C1.getIncasso()<<" frecce!";
	}
	
	return 0;
}
Example #10
0
 int main(void){
 Marray<double,4> A4(3,3,3,3);
 Marray<double,1> B1(3);
 Marray<double,3> C3Test(3,3,3);
 Marray<double,3> C3(3,3,3);
 A4.sucesion(0,1);
 B1.sucesion(0,1);
 Index<'i'> iG;
 Index<'j'> jG;
 Index<'k'> kG;
 Index<'l'> lG;
 for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for(int k=0;k<3;k++){
                 C3(i,j,k)+=A4(i,j,k,l)*B1(l);
           }
     }
        }
}

C3Test(iG,jG,kG)=A4(iG,jG,kG,lG)*B1(lG);
assert(C3==C3Test);


C3=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for(int k=0;k<3;k++){
                 C3(i,j,k)+=A4(i,j,l,k)*B1(l);
           }
     }
        }
}

C3Test(iG,jG,kG)=A4(iG,jG,lG,kG)*B1(lG);
assert(C3==C3Test);


C3=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for(int k=0;k<3;k++){
                 C3(i,j,k)+=A4(i,l,j,k)*B1(l);
           }
     }
        }
}

C3Test(iG,jG,kG)=A4(iG,lG,jG,kG)*B1(lG);
assert(C3==C3Test);


C3=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for(int k=0;k<3;k++){
                 C3(i,j,k)+=A4(j,i,k,l)*B1(l);
           }
     }
        }
}

C3Test(iG,jG,kG)=A4(jG,iG,kG,lG)*B1(lG);
assert(C3==C3Test);


C3=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for(int k=0;k<3;k++){
                 C3(i,j,k)+=A4(l,i,j,k)*B1(l);
           }
     }
        }
}

C3Test(iG,jG,kG)=A4(lG,iG,jG,kG)*B1(lG);
assert(C3==C3Test);


C3=0;


}
Example #11
0
            blit(muertebmp,enemigom,0,0,0,0,33,33);//carga la imagen sobre el buffer pacman
            draw_sprite(buffer,enemigom,_x,_y);
            blit(buffer, screen ,0,0,0,0,1280,600);
            rest(80);

        _x = 0;
        _y = 0;
        vidaenemigo--;
    }
}

int main()
{

    allegro_init();
    install_keyboard();

    set_color_depth(32);
    set_gfx_mode(GFX_AUTODETECT_WINDOWED,1280, 600 , 0, 0);

    //inicializa la musica en allegro
    if (install_sound(DIGI_AUTODETECT, MIDI_AUTODETECT, NULL) != 0)
        {
            allegro_message("Error: inicializando sistema de sonido\n%s\n", allegro_error);
            return 1;
        }
    // ajuste de volumen
    set_volume(70, 70);//cuanto se oye a la izquierdsa y a la derecha

    intro = load_wav("music/start.wav");
    sirenafantasma = load_wav("music/sirene.wav");
    muertes = load_wav("music/muerte.wav");

    buffer = create_bitmap(1280,600); //870 570
    pacman = create_bitmap(33,33);
    complemento = create_bitmap(400,600);
    vid =create_bitmap(33,33);
    ataqueb = create_bitmap(33,33);

    atabmp = load_bitmap("images/ataque.bmp",NULL);
    roca = load_bitmap("images/tile2.bmp",NULL);
    pacbmp =load_bitmap("images/tank2.bmp", NULL);
    comida = load_bitmap("images/Comida.bmp",NULL);
    muertebmp = load_bitmap("images/muerte1.bmp",NULL);
    combmp =load_bitmap("images/complemento.bmp",NULL);
    vidas = load_bitmap("images/vidas.bmp",NULL);

    mapa1 mapa;
    enemigo A1(30*1,30*18) ;
    enemigo A2(30*27,30*1) ;
    enemigo A3(30*14,30*11) ;
    enemigo A4(30*27,30*18) ;
    enemigo A5(30*27,30*18);
    personaje1 personaje;
    personaje2 personaje3;



    play_sample(intro,200,150,1000,0); // volumen,sonido,,velocidad a la que se reproduce,distribucion 1000 es punto medio,para que no se repita
    rest(4000);

    play_sample(sirenafantasma,150,150,1000,1);

    while (!key[KEY_ESC] && mapa.game_over())
    {
        if(A1.getvida()==0 && A2.getvida()==0 && A3.getvida()==0 && A4.getvida()==0) return false;

        personaje.mover_personaje();
        mapa.dibujar_mapa();
        personaje.dibujar_personaje();
        personaje.ataque();
        personaje.ataque1();
        personaje3.dibujar_personaje();
        personaje3.mover_personaje();
        A1.mover_enemigo();
        A2.mover_enemigo();
        A4.mover_enemigo();
        A3.mover_enemigo();
        personaje3.ataque();
        personaje3.ataque1();
        A1.ataque2();
        A1.ataque_enemigo();
        A2.ataque2();
        A2.ataque_enemigo();
        A4.ataque2();
        A4.ataque_enemigo();
        A3.ataque2();
        A3.ataque_enemigo();
        A1.muerte_enemigo();
        A2.muerte_enemigo();
SolidesP	ConstruireNormale (FacesP Face)
// Construit un solide symbolisant la normale à la face.
// Le solide est placé sur le barycentre de la face et peut donc
// être hors de la face.
// Sa longueur est égale à 5% de la dimension du solide à laquelle la
// face appartient s'il existe. Sinon, c'est 10 % de la dimension de la face.
{
	SolidesP	Sol = Face.Solide () ;

	double	HauteurTot ;

	Englobants3D	EnglobantFace = Face.Englobant () ;

	if (Sol.EstInitialise ()) {
		Englobants3D	E = Sol.Englobant () ;
		Vecteurs3D		V (E.BasGauche (),E.HautDroit ()) ;
		HauteurTot = 0.05*V.Norme () ; ;
	}
	else {
		Vecteurs3D		V (EnglobantFace.BasGauche (),EnglobantFace.HautDroit ()) ;
		HauteurTot = 0.1*V.Norme () ; ;
	}

	double	LargeurPied = HauteurTot / 24,
            LargeurTete = HauteurTot / 4,
            HauteurPied = (7./8.)*HauteurTot ;

	// Construction d'un repère centré sur le "barycentre" de la face, dont
	// le (xOy) correspond au plan de la face et dont le z est la normale à
	// la face.
	Points3D	Origine = 0.5*(EnglobantFace.BasGauche ()+EnglobantFace.HautDroit ()) ;

	Vecteurs3D	K = Face.VecteurNormal ().VecteurNorme (),
				U (Face.ContourExterieur ().IemeAreteOrientee (0).Origine ().Point3D (),
				Face.ContourExterieur ().IemeAreteOrientee (0).Extremite ().Point3D ()),
				I = (K & U).VecteurNorme (),
				J = (K & I).VecteurNorme () ;

	SommetsP	S1 (Origine-LargeurPied/2*I - LargeurPied/2*J) ;
	SommetsP	S2 (Origine-LargeurPied/2*I + LargeurPied/2*J) ;
	SommetsP	S3 (Origine+LargeurPied/2*I + LargeurPied/2*J) ;
	SommetsP	S4 (Origine+LargeurPied/2*I - LargeurPied/2*J) ;
	SommetsP	S5 (Origine-LargeurPied/2*I - LargeurPied/2*J + HauteurPied*K) ;
	SommetsP	S6 (Origine-LargeurPied/2*I + LargeurPied/2*J + HauteurPied*K) ;
	SommetsP	S7 (Origine+LargeurPied/2*I + LargeurPied/2*J + HauteurPied*K) ;
	SommetsP	S8 (Origine+LargeurPied/2*I - LargeurPied/2*J + HauteurPied*K) ;
	SommetsP	S9 (Origine-LargeurTete/2*I - LargeurTete/2*J + HauteurPied*K) ;
	SommetsP	S10 (Origine-LargeurTete/2*I + LargeurTete/2*J + HauteurPied*K) ;
	SommetsP	S11 (Origine+LargeurTete/2*I + LargeurTete/2*J + HauteurPied*K) ;
	SommetsP	S12 (Origine+LargeurTete/2*I - LargeurTete/2*J + HauteurPied*K) ;
	SommetsP	S13 (Origine+HauteurTot*K) ;

	AretesP	A1 (S1,S2) ;
	AretesP	A2 (S2,S3) ;
	AretesP	A3 (S3,S4) ;
	AretesP	A4 (S4,S1) ;
	AretesP	A5 (S5,S6) ;
	AretesP	A6 (S6,S7) ;
	AretesP	A7 (S7,S8) ;
	AretesP	A8 (S8,S5) ;
	AretesP	A9 (S9,S10) ;
	AretesP	A10 (S10,S11) ;
	AretesP	A11 (S11,S12) ;
	AretesP	A12 (S12,S9) ;
	AretesP	A13 (S1,S5) ;
	AretesP	A14 (S2,S6) ;
	AretesP	A15 (S3,S7) ;
	AretesP	A16 (S4,S8) ;
	AretesP	A17 (S9,S13) ;
	AretesP	A18 (S10,S13) ;
	AretesP	A19 (S11,S13) ;
	AretesP	A20 (S12,S13) ;

	Listes <AretesP>	L1 ;
	L1.InsertionEnQueue (A1) ;
	L1.InsertionEnQueue (A2) ;
	L1.InsertionEnQueue (A3) ;
	L1.InsertionEnQueue (A4) ;

	Listes <AretesP>	L2 ;
	L2.InsertionEnQueue (A1) ;
	L2.InsertionEnQueue (A13) ;
	L2.InsertionEnQueue (A5) ;
	L2.InsertionEnQueue (A14) ;

	Listes <AretesP>	L3 ;
	L3.InsertionEnQueue (A2) ;
	L3.InsertionEnQueue (A14) ;
	L3.InsertionEnQueue (A6) ;
	L3.InsertionEnQueue (A15) ;

	Listes <AretesP>	L4 ;
	L4.InsertionEnQueue (A3) ;
	L4.InsertionEnQueue (A15) ;
	L4.InsertionEnQueue (A7) ;
	L4.InsertionEnQueue (A16) ;

	Listes <AretesP>	L5 ;
	L5.InsertionEnQueue (A4) ;
	L5.InsertionEnQueue (A16) ;
	L5.InsertionEnQueue (A8) ;
	L5.InsertionEnQueue (A13) ;

	Listes <AretesP>	L6 ;
	L6.InsertionEnQueue (A9) ;
	L6.InsertionEnQueue (A10) ;
	L6.InsertionEnQueue (A11) ;
	L6.InsertionEnQueue (A12) ;

	Listes <AretesP>	L7 ;
	L7.InsertionEnQueue (A8) ;
	L7.InsertionEnQueue (A7) ;
	L7.InsertionEnQueue (A6) ;
	L7.InsertionEnQueue (A5) ;

	Listes <AretesP>	L8 ;
	L8.InsertionEnQueue (A9) ;
	L8.InsertionEnQueue (A17) ;
	L8.InsertionEnQueue (A18) ;

	Listes <AretesP>	L9 ;
	L9.InsertionEnQueue (A10) ;
	L9.InsertionEnQueue (A18) ;
	L9.InsertionEnQueue (A19) ;

	Listes <AretesP>	L10 ;
	L10.InsertionEnQueue (A11) ;
	L10.InsertionEnQueue (A19) ;
	L10.InsertionEnQueue (A20) ;

	Listes <AretesP>	L11 ;
	L11.InsertionEnQueue (A12) ;
	L11.InsertionEnQueue (A20) ;
	L11.InsertionEnQueue (A17) ;

	Listes <FacesP>	ListeFaces ;
	AttributsFaces	*PAF = new AttributsFaces (PMateriauRouge) ;
	FacesP F1 (ContoursP (L1),PAF) ;
	ListeFaces.InsertionEnQueue (F1) ;
	ListeFaces.InsertionEnQueue (FacesP (ContoursP (L2),PAF)) ;
	ListeFaces.InsertionEnQueue (FacesP (ContoursP (L3),PAF)) ;
	ListeFaces.InsertionEnQueue (FacesP (ContoursP (L4),PAF)) ;
	ListeFaces.InsertionEnQueue (FacesP (ContoursP (L5),PAF)) ;
	ContoursP C (L6) ;
	FacesP	F (C,PAF) ;
	F.AjouterContourInterieur (ContoursP (L7)) ;
	ListeFaces.InsertionEnQueue (F) ;
	ListeFaces.InsertionEnQueue (FacesP (ContoursP (L8),PAF)) ;
	ListeFaces.InsertionEnQueue (FacesP (ContoursP (L9),PAF)) ;
	ListeFaces.InsertionEnQueue (FacesP (ContoursP (L10),PAF)) ;
	ListeFaces.InsertionEnQueue (FacesP (ContoursP (L11),PAF)) ;

	return SolidesP (ListeFaces) ;
}
Example #13
0
int main(int argc, char *argv[])
{
  int ierr = 0, forierr = 0;
  bool debug = false;

#ifdef EPETRA_MPI

  // Initialize MPI

  MPI_Init(&argc,&argv);
  int rank; // My process ID

  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  Epetra_MpiComm Comm( MPI_COMM_WORLD );

#else

  int rank = 0;
  Epetra_SerialComm Comm;

#endif

  bool verbose = false;

  // Check if we should print results to standard out
  if (argc>1) if (argv[1][0]=='-' && argv[1][1]=='v') verbose = true;

  int verbose_int = verbose ? 1 : 0;
  Comm.Broadcast(&verbose_int, 1, 0);
  verbose = verbose_int==1 ? true : false;


  //  char tmp;
  //  if (rank==0) cout << "Press any key to continue..."<< std::endl;
  //  if (rank==0) cin >> tmp;
  //  Comm.Barrier();

  Comm.SetTracebackMode(0); // This should shut down any error traceback reporting
  int MyPID = Comm.MyPID();
  int NumProc = Comm.NumProc();

  if(verbose && MyPID==0)
    cout << Epetra_Version() << std::endl << std::endl;

  if (verbose) cout << "Processor "<<MyPID<<" of "<< NumProc
		    << " is alive."<<endl;

  bool verbose1 = verbose;

  // Redefine verbose to only print on PE 0
  if(verbose && rank!=0) 
		verbose = false;

  int NumMyEquations = 10000;
  int NumGlobalEquations = (NumMyEquations * NumProc) + EPETRA_MIN(NumProc,3);
  if(MyPID < 3) 
    NumMyEquations++;

  // Construct a Map that puts approximately the same Number of equations on each processor

  Epetra_Map Map(NumGlobalEquations, NumMyEquations, 0, Comm);
  
  // Get update list and number of local equations from newly created Map
  int* MyGlobalElements = new int[Map.NumMyElements()];
  Map.MyGlobalElements(MyGlobalElements);

  // Create an integer vector NumNz that is used to build the Petra Matrix.
  // NumNz[i] is the Number of OFF-DIAGONAL term for the ith global equation on this processor

  int* NumNz = new int[NumMyEquations];

  // We are building a tridiagonal matrix where each row has (-1 2 -1)
  // So we need 2 off-diagonal terms (except for the first and last equation)

  for (int i = 0; i < NumMyEquations; i++)
    if((MyGlobalElements[i] == 0) || (MyGlobalElements[i] == NumGlobalEquations - 1))
      NumNz[i] = 1;
    else
      NumNz[i] = 2;

  // Create a Epetra_Matrix

  Epetra_CrsMatrix A(Copy, Map, NumNz);
  EPETRA_TEST_ERR(A.IndicesAreGlobal(),ierr);
  EPETRA_TEST_ERR(A.IndicesAreLocal(),ierr);
  
  // Add  rows one-at-a-time
  // Need some vectors to help
  // Off diagonal Values will always be -1


  double* Values = new double[2];
  Values[0] = -1.0; 
	Values[1] = -1.0;
  int* Indices = new int[2];
  double two = 2.0;
  int NumEntries;

  forierr = 0;
  for (int i = 0; i < NumMyEquations; i++) {
    if(MyGlobalElements[i] == 0) {
			Indices[0] = 1;
			NumEntries = 1;
		}
    else if (MyGlobalElements[i] == NumGlobalEquations-1) {
			Indices[0] = NumGlobalEquations-2;
			NumEntries = 1;
		}
    else {
			Indices[0] = MyGlobalElements[i]-1;
			Indices[1] = MyGlobalElements[i]+1;
			NumEntries = 2;
		}
		forierr += !(A.InsertGlobalValues(MyGlobalElements[i], NumEntries, Values, Indices)==0);
		forierr += !(A.InsertGlobalValues(MyGlobalElements[i], 1, &two, MyGlobalElements+i)>0); // Put in the diagonal entry
  }
  EPETRA_TEST_ERR(forierr,ierr);

  int * indexOffsetTmp;
  int * indicesTmp;
  double * valuesTmp;
  // Finish up
  EPETRA_TEST_ERR(!(A.IndicesAreGlobal()),ierr);
  EPETRA_TEST_ERR(!(A.ExtractCrsDataPointers(indexOffsetTmp, indicesTmp, valuesTmp)==-1),ierr);  // Should fail
  EPETRA_TEST_ERR(!(A.FillComplete(false)==0),ierr);
  EPETRA_TEST_ERR(!(A.ExtractCrsDataPointers(indexOffsetTmp, indicesTmp, valuesTmp)==-1),ierr);  // Should fail
  EPETRA_TEST_ERR(!(A.IndicesAreLocal()),ierr);
  EPETRA_TEST_ERR(A.StorageOptimized(),ierr);
  A.OptimizeStorage();
  EPETRA_TEST_ERR(!(A.StorageOptimized()),ierr);
  EPETRA_TEST_ERR(!(A.ExtractCrsDataPointers(indexOffsetTmp, indicesTmp, valuesTmp)==0),ierr);  // Should succeed
  const Epetra_CrsGraph & GofA = A.Graph();
  EPETRA_TEST_ERR((indicesTmp!=GofA[0] || valuesTmp!=A[0]),ierr); // Extra check to see if operator[] is consistent
  EPETRA_TEST_ERR(A.UpperTriangular(),ierr);
  EPETRA_TEST_ERR(A.LowerTriangular(),ierr);
	
  int NumMyNonzeros = 3 * NumMyEquations;
  if(A.LRID(0) >= 0) 
		NumMyNonzeros--; // If I own first global row, then there is one less nonzero
  if(A.LRID(NumGlobalEquations-1) >= 0) 
		NumMyNonzeros--; // If I own last global row, then there is one less nonzero
  EPETRA_TEST_ERR(check(A, NumMyEquations, NumGlobalEquations, NumMyNonzeros, 3*NumGlobalEquations-2, 
	       MyGlobalElements, verbose),ierr);
  forierr = 0;
  for (int i = 0; i < NumMyEquations; i++) 
		forierr += !(A.NumGlobalEntries(MyGlobalElements[i])==NumNz[i]+1);
  EPETRA_TEST_ERR(forierr,ierr);
  forierr = 0;
  for (int i = 0; i < NumMyEquations; i++) 
		forierr += !(A.NumMyEntries(i)==NumNz[i]+1);
  EPETRA_TEST_ERR(forierr,ierr);

  if (verbose) cout << "\n\nNumEntries function check OK" << std::endl<< std::endl;

  EPETRA_TEST_ERR(check_graph_sharing(Comm),ierr);

  // Create vectors for Power method

  Epetra_Vector q(Map);
  Epetra_Vector z(Map);
  Epetra_Vector resid(Map);

  // variable needed for iteration
  double lambda = 0.0;
  // int niters = 10000;
  int niters = 200;
  double tolerance = 1.0e-1;

  /////////////////////////////////////////////////////////////////////////////////////////////////
	
  // Iterate

  Epetra_Flops flopcounter;
  A.SetFlopCounter(flopcounter);
  q.SetFlopCounter(A);
  z.SetFlopCounter(A);
  resid.SetFlopCounter(A);
	

  Epetra_Time timer(Comm);
  EPETRA_TEST_ERR(power_method(false, A, q, z, resid, &lambda, niters, tolerance, verbose),ierr);
  double elapsed_time = timer.ElapsedTime();
  double total_flops = A.Flops() + q.Flops() + z.Flops() + resid.Flops();
  double MFLOPs = total_flops/elapsed_time/1000000.0;

  if (verbose) cout << "\n\nTotal MFLOPs for first solve = " << MFLOPs << std::endl<< std::endl;

  /////////////////////////////////////////////////////////////////////////////////////////////////
	
  // Solve transpose problem

  if (verbose) cout << "\n\nUsing transpose of matrix and solving again (should give same result).\n\n"
		    << std::endl;
  // Iterate
  lambda = 0.0;
  flopcounter.ResetFlops();
  timer.ResetStartTime();
  EPETRA_TEST_ERR(power_method(true, A, q, z, resid, &lambda, niters, tolerance, verbose),ierr);
  elapsed_time = timer.ElapsedTime();
  total_flops = A.Flops() + q.Flops() + z.Flops() + resid.Flops();
  MFLOPs = total_flops/elapsed_time/1000000.0;

  if (verbose) cout << "\n\nTotal MFLOPs for transpose solve = " << MFLOPs << std::endl<< endl;

  /////////////////////////////////////////////////////////////////////////////////////////////////

  // Increase diagonal dominance

  if (verbose) cout << "\n\nIncreasing the magnitude of first diagonal term and solving again\n\n"
		    << endl;

  
  if (A.MyGlobalRow(0)) {
    int numvals = A.NumGlobalEntries(0);
    double * Rowvals = new double [numvals];
    int    * Rowinds = new int    [numvals];
    A.ExtractGlobalRowCopy(0, numvals, numvals, Rowvals, Rowinds); // Get A[0,0]

    for (int i=0; i<numvals; i++) if (Rowinds[i] == 0) Rowvals[i] *= 10.0;
    
    A.ReplaceGlobalValues(0, numvals, Rowvals, Rowinds);
    delete [] Rowvals;
    delete [] Rowinds;
  }
  // Iterate (again)
  lambda = 0.0;
  flopcounter.ResetFlops();
  timer.ResetStartTime();
  EPETRA_TEST_ERR(power_method(false, A, q, z, resid, &lambda, niters, tolerance, verbose),ierr);
  elapsed_time = timer.ElapsedTime();
  total_flops = A.Flops() + q.Flops() + z.Flops() + resid.Flops();
  MFLOPs = total_flops/elapsed_time/1000000.0;

  if (verbose) cout << "\n\nTotal MFLOPs for second solve = " << MFLOPs << endl<< endl;

  /////////////////////////////////////////////////////////////////////////////////////////////////

  // Solve transpose problem

  if (verbose) cout << "\n\nUsing transpose of matrix and solving again (should give same result).\n\n"
		    << endl;

  // Iterate (again)
  lambda = 0.0;
  flopcounter.ResetFlops();
  timer.ResetStartTime();
  EPETRA_TEST_ERR(power_method(true, A, q, z, resid, &lambda, niters, tolerance, verbose),ierr);
  elapsed_time = timer.ElapsedTime();
  total_flops = A.Flops() + q.Flops() + z.Flops() + resid.Flops();
  MFLOPs = total_flops/elapsed_time/1000000.0;


  if (verbose) cout << "\n\nTotal MFLOPs for tranpose of second solve = " << MFLOPs << endl<< endl;

  if (verbose) cout << "\n\n*****Testing constant entry constructor" << endl<< endl;

  Epetra_CrsMatrix AA(Copy, Map, 5);
  
  if (debug) Comm.Barrier();

  double dble_one = 1.0;
  for (int i=0; i< NumMyEquations; i++) AA.InsertGlobalValues(MyGlobalElements[i], 1, &dble_one, MyGlobalElements+i);

  // Note:  All processors will call the following Insert routines, but only the processor
  //        that owns it will actually do anything

  int One = 1;
  if (AA.MyGlobalRow(0)) {
    EPETRA_TEST_ERR(!(AA.InsertGlobalValues(0, 0, &dble_one, &One)==0),ierr);
  }
  else EPETRA_TEST_ERR(!(AA.InsertGlobalValues(0, 1, &dble_one, &One)==-1),ierr);
  EPETRA_TEST_ERR(!(AA.FillComplete(false)==0),ierr);
  EPETRA_TEST_ERR(AA.StorageOptimized(),ierr);
  EPETRA_TEST_ERR(!(AA.UpperTriangular()),ierr);
  EPETRA_TEST_ERR(!(AA.LowerTriangular()),ierr);
  
  if (debug) Comm.Barrier();
  EPETRA_TEST_ERR(check(AA, NumMyEquations, NumGlobalEquations, NumMyEquations, NumGlobalEquations, 
	       MyGlobalElements, verbose),ierr);

  if (debug) Comm.Barrier();

  forierr = 0;
  for (int i=0; i<NumMyEquations; i++) forierr += !(AA.NumGlobalEntries(MyGlobalElements[i])==1);
  EPETRA_TEST_ERR(forierr,ierr);

  if (verbose) cout << "\n\nNumEntries function check OK" << endl<< endl;

  if (debug) Comm.Barrier();

  if (verbose) cout << "\n\n*****Testing copy constructor" << endl<< endl;

  Epetra_CrsMatrix B(AA);
  EPETRA_TEST_ERR(check(B, NumMyEquations, NumGlobalEquations, NumMyEquations, NumGlobalEquations, 
	       MyGlobalElements, verbose),ierr);

  forierr = 0;
  for (int i=0; i<NumMyEquations; i++) forierr += !(B.NumGlobalEntries(MyGlobalElements[i])==1);
  EPETRA_TEST_ERR(forierr,ierr);

  if (verbose) cout << "\n\nNumEntries function check OK" << endl<< endl;

  if (debug) Comm.Barrier();

  if (verbose) cout << "\n\n*****Testing local view constructor" << endl<< endl;

  Epetra_CrsMatrix BV(View, AA.RowMap(), AA.ColMap(), 0);

  forierr = 0;
  int* Inds;
  double* Vals;
  for (int i = 0; i < NumMyEquations; i++) {
    forierr += !(AA.ExtractMyRowView(i, NumEntries, Vals, Inds)==0);
    forierr += !(BV.InsertMyValues(i, NumEntries, Vals, Inds)==0);
  }
  BV.FillComplete(false);
  EPETRA_TEST_ERR(check(BV, NumMyEquations, NumGlobalEquations, NumMyEquations, NumGlobalEquations, 
												MyGlobalElements, verbose),ierr);

  forierr = 0;
  for (int i=0; i<NumMyEquations; i++) forierr += !(BV.NumGlobalEntries(MyGlobalElements[i])==1);
  EPETRA_TEST_ERR(forierr,ierr);

  if (verbose) cout << "\n\nNumEntries function check OK" << endl<< endl;

  if (debug) Comm.Barrier();
  if (verbose) cout << "\n\n*****Testing post construction modifications" << endl<< endl;

  EPETRA_TEST_ERR(!(B.InsertGlobalValues(0, 1, &dble_one, &One)==-2),ierr);


  // Release all objects
  delete [] NumNz;
  delete [] Values;
  delete [] Indices;
  delete [] MyGlobalElements;
			

  if (verbose1) {
    // Test ostream << operator (if verbose1)
    // Construct a Map that puts 2 equations on each PE
    
    int NumMyElements1 = 2;
    int NumMyEquations1 = NumMyElements1;
    int NumGlobalEquations1 = NumMyEquations1*NumProc;

    Epetra_Map Map1(-1, NumMyElements1, 0, Comm);
    
    // Get update list and number of local equations from newly created Map
    int * MyGlobalElements1 = new int[Map1.NumMyElements()];
    Map1.MyGlobalElements(MyGlobalElements1);
    
    // Create an integer vector NumNz that is used to build the Petra Matrix.
    // NumNz[i] is the Number of OFF-DIAGONAL term for the ith global equation on this processor
    
    int * NumNz1 = new int[NumMyEquations1];
    
    // We are building a tridiagonal matrix where each row has (-1 2 -1)
    // So we need 2 off-diagonal terms (except for the first and last equation)
    
    for (int i=0; i<NumMyEquations1; i++)
      if (MyGlobalElements1[i]==0 || MyGlobalElements1[i] == NumGlobalEquations1-1)
	NumNz1[i] = 1;
      else
	NumNz1[i] = 2;
    
    // Create a Epetra_Matrix
    
    Epetra_CrsMatrix A1(Copy, Map1, NumNz1);
    
    // Add  rows one-at-a-time
    // Need some vectors to help
    // Off diagonal Values will always be -1
    
    
    double *Values1 = new double[2];
    Values1[0] = -1.0; Values1[1] = -1.0;
    int *Indices1 = new int[2];
    double two1 = 2.0;
    int NumEntries1;

    forierr = 0;
    for (int i=0; i<NumMyEquations1; i++)
      {
	if (MyGlobalElements1[i]==0)
	  {
	    Indices1[0] = 1;
	    NumEntries1 = 1;
	  }
	else if (MyGlobalElements1[i] == NumGlobalEquations1-1)
	  {
	    Indices1[0] = NumGlobalEquations1-2;
	    NumEntries1 = 1;
	  }
	else
	  {
	    Indices1[0] = MyGlobalElements1[i]-1;
	    Indices1[1] = MyGlobalElements1[i]+1;
	    NumEntries1 = 2;
	  }
	forierr += !(A1.InsertGlobalValues(MyGlobalElements1[i], NumEntries1, Values1, Indices1)==0);
	forierr += !(A1.InsertGlobalValues(MyGlobalElements1[i], 1, &two1, MyGlobalElements1+i)>0); // Put in the diagonal entry
      }
    EPETRA_TEST_ERR(forierr,ierr);
    delete [] Indices1;
    delete [] Values1;
    
    // Finish up
    EPETRA_TEST_ERR(!(A1.FillComplete(false)==0),ierr);
    
    // Test diagonal extraction function

    Epetra_Vector checkDiag(Map1);
    EPETRA_TEST_ERR(!(A1.ExtractDiagonalCopy(checkDiag)==0),ierr);

    forierr = 0;
    for (int i=0; i<NumMyEquations1; i++) forierr += !(checkDiag[i]==two1);
    EPETRA_TEST_ERR(forierr,ierr);

    // Test diagonal replacement method

    forierr = 0;
    for (int i=0; i<NumMyEquations1; i++) checkDiag[i]=two1*two1;
    EPETRA_TEST_ERR(forierr,ierr);

    EPETRA_TEST_ERR(!(A1.ReplaceDiagonalValues(checkDiag)==0),ierr);

    Epetra_Vector checkDiag1(Map1);
    EPETRA_TEST_ERR(!(A1.ExtractDiagonalCopy(checkDiag1)==0),ierr);

    forierr = 0;
    for (int i=0; i<NumMyEquations1; i++) forierr += !(checkDiag[i]==checkDiag1[i]);
    EPETRA_TEST_ERR(forierr,ierr);

    if (verbose) cout << "\n\nDiagonal extraction and replacement OK.\n\n" << endl;

    double orignorm = A1.NormOne();
    EPETRA_TEST_ERR(!(A1.Scale(4.0)==0),ierr);
    EPETRA_TEST_ERR(!(A1.NormOne()!=orignorm),ierr);
    
    if (verbose) cout << "\n\nMatrix scale OK.\n\n" << endl;

    if (verbose) cout << "\n\nPrint out tridiagonal matrix, each part on each processor.\n\n" << endl;
    cout << A1 << endl;
   

  // Release all objects
  delete [] NumNz1;
  delete [] MyGlobalElements1;

  }

  if (verbose) cout << "\n\n*****Testing LeftScale and RightScale" << endl << endl;

  int NumMyElements2 = 7;
  int NumMyRows2 = 1;//This value should not be changed without editing the
		// code below.
  Epetra_Map RowMap(-1,NumMyRows2,0,Comm);
  Epetra_Map ColMap(NumMyElements2,NumMyElements2,0,Comm);
  // The DomainMap needs to be different from the ColMap for the test to 
  // be meaningful.
  Epetra_Map DomainMap(NumMyElements2,0,Comm);
  int NumMyRangeElements2 = 0;
  // We need to distribute the elements differently for the range map also.
  if (MyPID % 2 == 0)
    NumMyRangeElements2 = NumMyRows2*2; //put elements on even number procs 
  if (NumProc % 2 == 1 && MyPID == NumProc-1)
    NumMyRangeElements2 = NumMyRows2; //If number of procs is odd, put
			// the last NumMyElements2 elements on the last proc
  Epetra_Map RangeMap(-1,NumMyRangeElements2,0,Comm);
  Epetra_CrsMatrix A2(Copy,RowMap,ColMap,NumMyElements2);
  double * Values2 = new double[NumMyElements2];
  int * Indices2 = new int[NumMyElements2]; 

  for (int i=0; i<NumMyElements2; i++) {
    Values2[i] = i+MyPID;
    Indices2[i]=i;
  }

  A2.InsertMyValues(0,NumMyElements2,Values2,Indices2);
  A2.FillComplete(DomainMap,RangeMap,false);
  Epetra_CrsMatrix A2copy(A2);

  double * RowLeftScaleValues = new double[NumMyRows2];
  double * ColRightScaleValues = new double[NumMyElements2];
  int RowLoopLength = RowMap.MaxMyGID()-RowMap.MinMyGID()+1;
  for (int i=0; i<RowLoopLength; i++)
    RowLeftScaleValues[i] = (i + RowMap.MinMyGID() ) % 2 + 1;
  // For the column map, all procs own all elements
  for (int  i=0; i<NumMyElements2;i++)
    ColRightScaleValues[i] = i % 2 + 1;

  int RangeLoopLength = RangeMap.MaxMyGID()-RangeMap.MinMyGID()+1;
  double * RangeLeftScaleValues = new double[RangeLoopLength];
  int DomainLoopLength = DomainMap.MaxMyGID()-DomainMap.MinMyGID()+1;
   double * DomainRightScaleValues = new double[DomainLoopLength];
  for (int i=0; i<RangeLoopLength; i++)
    RangeLeftScaleValues[i] = 1.0/((i + RangeMap.MinMyGID() ) % 2 + 1);
  for (int  i=0; i<DomainLoopLength;i++)
    DomainRightScaleValues[i] = 1.0/((i + DomainMap.MinMyGID() ) % 2 + 1);
                                                                                
  Epetra_Vector xRow(View,RowMap,RowLeftScaleValues);
  Epetra_Vector xCol(View,ColMap,ColRightScaleValues);
  Epetra_Vector xRange(View,RangeMap,RangeLeftScaleValues);
  Epetra_Vector xDomain(View,DomainMap,DomainRightScaleValues);

  double A2infNorm = A2.NormInf();
  double A2oneNorm = A2.NormOne();

  if (verbose1) cout << A2;
  EPETRA_TEST_ERR(A2.LeftScale(xRow),ierr);
  double A2infNorm1 = A2.NormInf();
  double A2oneNorm1 = A2.NormOne();
  bool ScalingBroke = false;
  if (A2infNorm1>2*A2infNorm||A2infNorm1<A2infNorm) {
    EPETRA_TEST_ERR(-31,ierr);
    ScalingBroke = true;
  }
  if (A2oneNorm1>2*A2oneNorm||A2oneNorm1<A2oneNorm) {

    EPETRA_TEST_ERR(-32,ierr);
    ScalingBroke = true;
  }
  if (verbose1) cout << A2;
  EPETRA_TEST_ERR(A2.RightScale(xCol),ierr);
  double A2infNorm2 = A2.NormInf();
  double A2oneNorm2 = A2.NormOne();
  if (A2infNorm2>=2*A2infNorm1||A2infNorm2<=A2infNorm1) {
    EPETRA_TEST_ERR(-33,ierr);
    ScalingBroke = true;
  }
  if (A2oneNorm2>2*A2oneNorm1||A2oneNorm2<=A2oneNorm1) {
    EPETRA_TEST_ERR(-34,ierr);
    ScalingBroke = true;
  }
  if (verbose1) cout << A2;
  EPETRA_TEST_ERR(A2.RightScale(xDomain),ierr);
  double A2infNorm3 = A2.NormInf();
  double A2oneNorm3 = A2.NormOne();
  // The last two scaling ops cancel each other out
  if (A2infNorm3!=A2infNorm1) {
    EPETRA_TEST_ERR(-35,ierr)
    ScalingBroke = true;
  }
  if (A2oneNorm3!=A2oneNorm1) {
    EPETRA_TEST_ERR(-36,ierr)
    ScalingBroke = true;
  }
  if (verbose1) cout << A2;
  EPETRA_TEST_ERR(A2.LeftScale(xRange),ierr);
  double A2infNorm4 = A2.NormInf();
  double A2oneNorm4 = A2.NormOne();
  // The 4 scaling ops all cancel out
  if (A2infNorm4!=A2infNorm) {
    EPETRA_TEST_ERR(-37,ierr)
    ScalingBroke = true;
  }
  if (A2oneNorm4!=A2oneNorm) {
    EPETRA_TEST_ERR(-38,ierr)
    ScalingBroke = true;
  }

  //
  //  Now try changing the values underneath and make sure that 
  //  telling one process about the change causes NormInf() and 
  //  NormOne() to recompute the norm on all processes.
  //
  
  double *values; 
  int num_my_rows = A2.NumMyRows() ; 
  int num_entries;

  for ( int  i=0 ; i< num_my_rows; i++ ) {
    EPETRA_TEST_ERR( A2.ExtractMyRowView( i, num_entries, values ), ierr );
    for ( int j = 0 ; j <num_entries; j++ ) {
      values[j] *= 2.0; 
    }
  }


  if ( MyPID == 0 )
    A2.SumIntoGlobalValues( 0, 0, 0, 0 ) ; 

  double A2infNorm5 = A2.NormInf();
  double A2oneNorm5 = A2.NormOne();

  if (A2infNorm5!=2.0 * A2infNorm4) {
    EPETRA_TEST_ERR(-39,ierr)
    ScalingBroke = true;
  }
  if (A2oneNorm5!= 2.0 * A2oneNorm4) {
    EPETRA_TEST_ERR(-40,ierr)
    ScalingBroke = true;
  }

  //
  //  Restore the values underneath
  //
  for ( int  i=0 ; i< num_my_rows; i++ ) {
    EPETRA_TEST_ERR( A2.ExtractMyRowView( i, num_entries, values ), ierr );
    for ( int j = 0 ; j <num_entries; j++ ) {
      values[j] /= 2.0; 
    }
  }

  if (verbose1) cout << A2;

  if (ScalingBroke) {
    if (verbose) cout << endl << "LeftScale and RightScale tests FAILED" << endl << endl;
  }
  else {
    if (verbose) cout << endl << "LeftScale and RightScale tests PASSED" << endl << endl;
  }

  Comm.Barrier();

  if (verbose) cout << "\n\n*****Testing InvRowMaxs and InvColMaxs" << endl << endl;

  if (verbose1) cout << A2 << endl;
  EPETRA_TEST_ERR(A2.InvRowMaxs(xRow),ierr);
  EPETRA_TEST_ERR(A2.InvRowMaxs(xRange),ierr);
  if (verbose1) cout << xRow << endl << xRange << endl;

  if (verbose) cout << "\n\n*****Testing InvRowSums and InvColSums" << endl << endl;
  bool InvSumsBroke = false;
// Works!
  EPETRA_TEST_ERR(A2.InvRowSums(xRow),ierr);
  if (verbose1) cout << xRow;
  EPETRA_TEST_ERR(A2.LeftScale(xRow),ierr);
  float A2infNormFloat = A2.NormInf();
  if (verbose1) cout << A2 << endl;
  if (fabs(1.0-A2infNormFloat) > 1.e-5) {
    EPETRA_TEST_ERR(-41,ierr);
    InvSumsBroke = true;
  }

  // Works
  int expectedcode = 1;
  if (Comm.NumProc()>1) expectedcode = 0;
  EPETRA_TEST_ERR(!(A2.InvColSums(xDomain)==expectedcode),ierr); // This matrix has a single row, the first column has a zero, so a warning is issued.
  if (verbose1) cout << xDomain << endl;
  EPETRA_TEST_ERR(A2.RightScale(xDomain),ierr);
  float A2oneNormFloat2 = A2.NormOne();
  if (verbose1) cout << A2;
  if (fabs(1.0-A2oneNormFloat2)>1.e-5) {
    EPETRA_TEST_ERR(-42,ierr)
    InvSumsBroke = true;
  }

// Works!
  EPETRA_TEST_ERR(A2.InvRowSums(xRange),ierr);

  if (verbose1) cout << xRange;
  EPETRA_TEST_ERR(A2.LeftScale(xRange),ierr);
  float A2infNormFloat2 = A2.NormInf(); // We use a float so that rounding error
	// will not prevent the sum from being 1.0.
  if (verbose1) cout << A2;
  if (fabs(1.0-A2infNormFloat2)>1.e-5) {
    cout << "InfNorm should be = 1, but InfNorm = " << A2infNormFloat2 << endl;
    EPETRA_TEST_ERR(-43,ierr);
    InvSumsBroke = true;
  }

  // Doesn't work - may not need this test because column ownership is not unique
  /*  EPETRA_TEST_ERR(A2.InvColSums(xCol),ierr);
cout << xCol;
  EPETRA_TEST_ERR(A2.RightScale(xCol),ierr);
  float A2oneNormFloat = A2.NormOne();
cout << A2;
  if (fabs(1.0-A2oneNormFloat)>1.e-5) {
    EPETRA_TEST_ERR(-44,ierr);
    InvSumsBroke = true;
  }
  */
  delete [] ColRightScaleValues;
  delete [] DomainRightScaleValues;
  if (verbose) cout << "Begin partial sum testing." << endl;
  // Test with a matrix that has partial sums for a subset of the rows 
  // on multiple processors. (Except for the serial case, of course.)
  int NumMyRows3 = 2; // Changing this requires further changes below
  int * myGlobalElements = new int[NumMyRows3];
  for (int i=0; i<NumMyRows3; i++) myGlobalElements[i] = MyPID+i;
  Epetra_Map RowMap3(NumProc*2, NumMyRows3, myGlobalElements, 0, Comm);
  int NumMyElements3 = 5;
  Epetra_CrsMatrix A3(Copy, RowMap3, NumMyElements3);
  double * Values3 = new double[NumMyElements3];
  int * Indices3 = new int[NumMyElements3];
  for (int i=0; i < NumMyElements3; i++) {
    Values3[i] = (int) (MyPID + (i+1));
    Indices3[i]=i;
  }
  for (int i=0; i<NumMyRows3; i++) {
    A3.InsertGlobalValues(myGlobalElements[i],NumMyElements3,Values3,Indices3);
  }
  Epetra_Map RangeMap3(NumProc+1, 0, Comm);
  Epetra_Map DomainMap3(NumMyElements3, 0, Comm);
  EPETRA_TEST_ERR(A3.FillComplete(DomainMap3, RangeMap3,false),ierr);
  if (verbose1) cout << A3;
  Epetra_Vector xRange3(RangeMap3,false);
  Epetra_Vector xDomain3(DomainMap3,false);

  EPETRA_TEST_ERR(A3.InvRowSums(xRange3),ierr);

  if (verbose1) cout << xRange3;
  EPETRA_TEST_ERR(A3.LeftScale(xRange3),ierr);
  float A3infNormFloat = A3.NormInf();
  if (verbose1) cout << A3;
  if (1.0!=A3infNormFloat) {
    cout << "InfNorm should be = 1, but InfNorm = " << A3infNormFloat <<endl;
    EPETRA_TEST_ERR(-61,ierr);
    InvSumsBroke = true;
  }
  // we want to take the transpose of our matrix and fill in different values.
  int NumMyColumns3 = NumMyRows3;
  Epetra_Map ColMap3cm(RowMap3); 
  Epetra_Map RowMap3cm(A3.ColMap());

  Epetra_CrsMatrix A3cm(Copy,RowMap3cm,ColMap3cm,NumProc+1);
  double *Values3cm = new double[NumMyColumns3];
  int * Indices3cm = new int[NumMyColumns3];
  for (int i=0; i<NumMyColumns3; i++) {
    Values3cm[i] = MyPID + i + 1;
    Indices3cm[i]= i + MyPID;
  }
  for (int ii=0; ii<NumMyElements3; ii++) {
    A3cm.InsertGlobalValues(ii, NumMyColumns3, Values3cm, Indices3cm);
  }

  // The DomainMap and the RangeMap from the last test will work fine for 
  // the RangeMap and DomainMap, respectively, but I will make copies to
  // avaoid confusion when passing what looks like a DomainMap where we
  // need a RangeMap and vice vera.
  Epetra_Map RangeMap3cm(DomainMap3);
  Epetra_Map DomainMap3cm(RangeMap3);
  EPETRA_TEST_ERR(A3cm.FillComplete(DomainMap3cm,RangeMap3cm),ierr);
  if (verbose1) cout << A3cm << endl;

  // Again, we can copy objects from the last example.
  //Epetra_Vector xRange3cm(xDomain3); //Don't use at this time
  Epetra_Vector xDomain3cm(DomainMap3cm,false);

  EPETRA_TEST_ERR(A3cm.InvColSums(xDomain3cm),ierr);

  if (verbose1) cout << xDomain3cm << endl;

  EPETRA_TEST_ERR(A3cm.RightScale(xDomain3cm),ierr);
  float A3cmOneNormFloat  = A3cm.NormOne();
  if (verbose1) cout << A3cm << endl;
  if (1.0!=A3cmOneNormFloat) {
    cout << "OneNorm should be = 1, but OneNorm = " << A3cmOneNormFloat << endl;
    EPETRA_TEST_ERR(-62,ierr);
    InvSumsBroke = true;
  }
  
  if (verbose) cout << "End partial sum testing" << endl;
  if (verbose) cout << "Begin replicated testing" << endl;

  // We will now view the shared row as a repliated row, rather than one 
  // that has partial sums of its entries on mulitple processors.
  // We will reuse much of the data used for the partial sum tesitng.
  Epetra_Vector xRow3(RowMap3,false); 
  Epetra_CrsMatrix A4(Copy, RowMap3, NumMyElements3);
  for (int ii=0; ii < NumMyElements3; ii++) {
    Values3[ii] = (int)((ii*.6)+1.0);
  }
  for (int ii=0; ii<NumMyRows3; ii++) {
    A4.InsertGlobalValues(myGlobalElements[ii],NumMyElements3,Values3,Indices3);
  }
  EPETRA_TEST_ERR(A4.FillComplete(DomainMap3, RangeMap3,false),ierr);
  if (verbose1) cout << A4 << endl;
  // The next two lines should be expanded into a verifiable test.
  EPETRA_TEST_ERR(A4.InvRowMaxs(xRow3),ierr);
  EPETRA_TEST_ERR(A4.InvRowMaxs(xRange3),ierr);
  if (verbose1) cout << xRow3 << xRange3;

  EPETRA_TEST_ERR(A4.InvRowSums(xRow3),ierr);                      
  if (verbose1) cout << xRow3;
  EPETRA_TEST_ERR(A4.LeftScale(xRow3),ierr);
  float A4infNormFloat = A4.NormInf();
  if (verbose1) cout << A4;
  if (2.0!=A4infNormFloat && NumProc != 1) {
    if (verbose1) cout << "InfNorm should be = 2 (because one column is replicated on two processors and NormOne() does not handle replication), but InfNorm = " << A4infNormFloat <<endl;
    EPETRA_TEST_ERR(-63,ierr);
    InvSumsBroke = true;
  }
  else if (1.0!=A4infNormFloat && NumProc == 1) {
    if (verbose1) cout << "InfNorm should be = 1, but InfNorm = " << A4infNormFloat <<endl;
    EPETRA_TEST_ERR(-63,ierr);
    InvSumsBroke = true;
  }
  
  Epetra_Vector xCol3cm(ColMap3cm,false);
  Epetra_CrsMatrix A4cm(Copy, RowMap3cm, ColMap3cm, NumProc+1);
  //Use values from A3cm
  for (int ii=0; ii<NumMyElements3; ii++) {
    A4cm.InsertGlobalValues(ii,NumMyColumns3,Values3cm,Indices3cm);
  }
  EPETRA_TEST_ERR(A4cm.FillComplete(DomainMap3cm, RangeMap3cm,false),ierr);
  if (verbose1) cout << A4cm << endl;
  // The next two lines should be expanded into a verifiable test.
  EPETRA_TEST_ERR(A4cm.InvColMaxs(xCol3cm),ierr);
  EPETRA_TEST_ERR(A4cm.InvColMaxs(xDomain3cm),ierr);
  if (verbose1) cout << xCol3cm << xDomain3cm;

  EPETRA_TEST_ERR(A4cm.InvColSums(xCol3cm),ierr);
 
  if (verbose1) cout << xCol3cm << endl;
  EPETRA_TEST_ERR(A4cm.RightScale(xCol3cm),ierr);
  float A4cmOneNormFloat = A4cm.NormOne();
  if (verbose1) cout << A4cm << endl;
  if (2.0!=A4cmOneNormFloat && NumProc != 1) {
    if (verbose1) cout << "OneNorm should be = 2 (because one column is replicated on two processors and NormOne() does not handle replication), but OneNorm = " << A4cmOneNormFloat << endl;
    EPETRA_TEST_ERR(-64,ierr);
    InvSumsBroke = true;
  }
  else if (1.0!=A4cmOneNormFloat && NumProc == 1) {
    if (verbose1) cout << "OneNorm should be = 1, but OneNorm = " << A4infNormFloat <<endl;
    EPETRA_TEST_ERR(-64,ierr);
    InvSumsBroke = true;
  }

  if (verbose) cout << "End replicated testing" << endl;

  if (InvSumsBroke) {
    if (verbose) cout << endl << "InvRowSums tests FAILED" << endl << endl;
  }
  else
    if (verbose) cout << endl << "InvRowSums tests PASSED" << endl << endl;

  A3cm.PutScalar(2.0);
  int nnz_A3cm = A3cm.Graph().NumGlobalNonzeros();
  double check_frobnorm = sqrt(nnz_A3cm*4.0);
  double frobnorm = A3cm.NormFrobenius();

  bool frobnorm_test_failed = false;
  if (fabs(check_frobnorm-frobnorm) > 5.e-5) {
    frobnorm_test_failed = true;
  }

  if (frobnorm_test_failed) {
    if (verbose) std::cout << "Frobenius-norm test FAILED."<<std::endl;
    EPETRA_TEST_ERR(-65, ierr);
  }

  delete [] Values2;
  delete [] Indices2;
  delete [] myGlobalElements;
  delete [] Values3;
  delete [] Indices3;
  delete [] Values3cm;
  delete [] Indices3cm;
  delete [] RangeLeftScaleValues;
  delete [] RowLeftScaleValues;
#ifdef EPETRA_MPI
  MPI_Finalize() ;
#endif

/* end main
*/
return ierr ;
}
Example #14
0
void ConstructA_CG2(const mesh& Mesh, FullMatrix& A)
{
  const int NumPhysElems = Mesh.get_NumPhysElems();
  const int NumBndNodes  = Mesh.get_SubNumBndNodes();
  const int Asize = Mesh.get_SubNumPhysNodes();

  assert_eq(Asize,A.get_NumRows());
  assert_eq(Asize,A.get_NumCols());
  
  dTensor1 A1(6);
  dTensor1 A2(6);
  dTensor1 A3(6);
  dTensor1 A4(6);
  dTensor1 A5(6);
  dTensor1 A6(6);

  A1.set(1, -oneninth     );
  A1.set(2,  4.0*oneninth );
  A1.set(3, -oneninth     );
  A1.set(4,  4.0*oneninth );
  A1.set(5,  4.0*oneninth );
  A1.set(6, -oneninth     );
  
  A2.set(1, -onethird     );
  A2.set(2,  0.0          );
  A2.set(3,  onethird     );
  A2.set(4, -4.0*onethird );
  A2.set(5,  4.0*onethird );
  A2.set(6,  0.0          );
  
  A3.set(1, -onethird     );
  A3.set(2, -4.0*onethird );
  A3.set(3,  0.0          );
  A3.set(4,  0.0          );
  A3.set(5,  4.0*onethird );
  A3.set(6,  onethird     );
  
  A4.set(1,  4.0          );
  A4.set(2, -4.0          );
  A4.set(3,  0.0          );
  A4.set(4, -4.0          );
  A4.set(5,  4.0          );
  A4.set(6,  0.0          );

  A5.set(1,  2.0          );
  A5.set(2, -4.0          );
  A5.set(3,  2.0          );
  A5.set(4,  0.0          );
  A5.set(5,  0.0          );
  A5.set(6,  0.0          );
  
  A6.set(1,  2.0          );
  A6.set(2,  0.0          );
  A6.set(3,  0.0          );
  A6.set(4, -4.0          );
  A6.set(5,  0.0          );
  A6.set(6,  2.0          );

  dTensor2 spts(3,2);
  spts.set(1,1,  1.0/3.0 );
  spts.set(1,2, -1.0/6.0 );
  
  spts.set(2,1, -1.0/6.0 );
  spts.set(2,2, -1.0/6.0 );
  
  spts.set(3,1, -1.0/6.0 );
  spts.set(3,2,  1.0/3.0 );
  
  dTensor1 wgts(3);
  wgts.set(1, 1.0/6.0 );
  wgts.set(2, 1.0/6.0 );
  wgts.set(3, 1.0/6.0 );
  
  // Loop over all elements in the mesh
  for (int i=1; i<=NumPhysElems; i++)
    {
      // Information for element i
      iTensor1 tt(6);
      for (int k=1; k<=6; k++)
	{  tt.set(k, Mesh.get_node_subs(i,k) );  }
      
      // Evaluate gradients of the Lagrange polynomials on Gauss quadrature points      
      dTensor2 gpx(6,3);
      dTensor2 gpy(6,3);
      
      for (int m=1; m<=3; m++)
	{
	  double  xi = spts.get(m,1);
	  double eta = spts.get(m,2);
	  
	  for (int k=1; k<=6; k++)
	    {
	      double gp_xi  = A2.get(k) + 2.0*A5.get(k)*xi + A4.get(k)*eta;
	      double gp_eta = A3.get(k) + A4.get(k)*xi + 2.0*A6.get(k)*eta;

	      gpx.set(k,m, Mesh.get_jmat(i,1,1)*gp_xi
		         + Mesh.get_jmat(i,1,2)*gp_eta );
	      gpy.set(k,m, Mesh.get_jmat(i,2,1)*gp_xi
		         + Mesh.get_jmat(i,2,2)*gp_eta );
	    }
	}

      // Entries of the stiffness matrix A
      double Area = Mesh.get_area_prim(i);
      for (int j=1; j<=6; j++)
	for (int k=1; k<=6; k++)
	  {
	    double tmp = A.get(tt.get(j),tt.get(k));
	    for (int m=1; m<=3; m++)
	      {
		tmp = tmp + 2.0*Area*wgts.get(m)*(gpx.get(j,m)*gpx.get(k,m)+gpy.get(j,m)*gpy.get(k,m));
	      }
	    A.set(tt.get(j),tt.get(k), tmp );
	  }
    }

  // Replace boundary node equations by Dirichlet boundary condition enforcement
  for (int i=1; i<=NumBndNodes; i++)
    {
      const int j=Mesh.get_sub_bnd_node(i);
      
      for (int k=1; k<=A.get_NumCols(); k++)
	{
	  A.set(j,k, 0.0 );	  
	}
      for (int k=1; k<=A.get_NumRows(); k++)
	{
	  A.set(k,j, 0.0 );
	}
      A.set(j,j, 1.0 );
    }

  // Get sparse structure representation
  A.Sparsify();
  
}
Example #15
0
 int main(void){
 Marray<double,4> A4(3,3,3,3);
 Marray<double,4> B4(3,3,3,3);
 Marray<double,4> C4Test(3,3,3,3);
 Marray<double,4> C4(3,3,3,3);
 A4.sucesion(0,1);
 B4.sucesion(0,1);
 Index<'i'> iG;
 Index<'j'> jG;
 Index<'k'> kG;
 Index<'l'> lG;
 Index<'m'> mG;
 Index<'n'> nG;
 for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,j,k,l)*B4(k,l,m,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,jG,kG,lG)*B4(kG,lG,mG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,j,k,l)*B4(k,m,l,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,jG,kG,lG)*B4(kG,mG,lG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,j,k,l)*B4(k,m,n,l);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,jG,kG,lG)*B4(kG,mG,nG,lG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,j,k,l)*B4(l,k,m,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,jG,kG,lG)*B4(lG,kG,mG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,j,k,l)*B4(l,m,k,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,jG,kG,lG)*B4(lG,mG,kG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,j,k,l)*B4(l,m,n,k);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,jG,kG,lG)*B4(lG,mG,nG,kG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,j,k,l)*B4(m,k,l,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,jG,kG,lG)*B4(mG,kG,lG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,j,k,l)*B4(m,k,n,l);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,jG,kG,lG)*B4(mG,kG,nG,lG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,j,k,l)*B4(m,l,k,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,jG,kG,lG)*B4(mG,lG,kG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,j,k,l)*B4(m,l,n,k);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,jG,kG,lG)*B4(mG,lG,nG,kG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,j,k,l)*B4(m,n,k,l);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,jG,kG,lG)*B4(mG,nG,kG,lG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,j,k,l)*B4(m,n,l,k);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,jG,kG,lG)*B4(mG,nG,lG,kG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,j,l,k)*B4(l,k,m,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,jG,lG,kG)*B4(lG,kG,mG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,k,j,l)*B4(k,l,m,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,kG,jG,lG)*B4(kG,lG,mG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,k,j,l)*B4(k,m,l,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,kG,jG,lG)*B4(kG,mG,lG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,k,j,l)*B4(k,m,n,l);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,kG,jG,lG)*B4(kG,mG,nG,lG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,k,j,l)*B4(l,k,m,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,kG,jG,lG)*B4(lG,kG,mG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,k,j,l)*B4(l,m,k,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,kG,jG,lG)*B4(lG,mG,kG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,k,j,l)*B4(l,m,n,k);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,kG,jG,lG)*B4(lG,mG,nG,kG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,k,j,l)*B4(m,k,l,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,kG,jG,lG)*B4(mG,kG,lG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,k,j,l)*B4(m,k,n,l);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,kG,jG,lG)*B4(mG,kG,nG,lG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,k,j,l)*B4(m,l,k,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,kG,jG,lG)*B4(mG,lG,kG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,k,j,l)*B4(m,l,n,k);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,kG,jG,lG)*B4(mG,lG,nG,kG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,k,j,l)*B4(m,n,k,l);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,kG,jG,lG)*B4(mG,nG,kG,lG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,k,j,l)*B4(m,n,l,k);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,kG,jG,lG)*B4(mG,nG,lG,kG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,k,l,j)*B4(k,l,m,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,kG,lG,jG)*B4(kG,lG,mG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,k,l,j)*B4(k,m,l,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,kG,lG,jG)*B4(kG,mG,lG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,k,l,j)*B4(k,m,n,l);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,kG,lG,jG)*B4(kG,mG,nG,lG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,k,l,j)*B4(l,k,m,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,kG,lG,jG)*B4(lG,kG,mG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,k,l,j)*B4(l,m,k,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,kG,lG,jG)*B4(lG,mG,kG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,k,l,j)*B4(l,m,n,k);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,kG,lG,jG)*B4(lG,mG,nG,kG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,k,l,j)*B4(m,k,l,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,kG,lG,jG)*B4(mG,kG,lG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,k,l,j)*B4(m,k,n,l);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,kG,lG,jG)*B4(mG,kG,nG,lG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,k,l,j)*B4(m,l,k,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,kG,lG,jG)*B4(mG,lG,kG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,k,l,j)*B4(m,l,n,k);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,kG,lG,jG)*B4(mG,lG,nG,kG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,k,l,j)*B4(m,n,k,l);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,kG,lG,jG)*B4(mG,nG,kG,lG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(i,k,l,j)*B4(m,n,l,k);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(iG,kG,lG,jG)*B4(mG,nG,lG,kG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(k,i,j,l)*B4(k,l,m,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(kG,iG,jG,lG)*B4(kG,lG,mG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(k,i,j,l)*B4(k,m,l,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(kG,iG,jG,lG)*B4(kG,mG,lG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(k,i,j,l)*B4(k,m,n,l);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(kG,iG,jG,lG)*B4(kG,mG,nG,lG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(k,i,j,l)*B4(l,k,m,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(kG,iG,jG,lG)*B4(lG,kG,mG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(k,i,j,l)*B4(l,m,k,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(kG,iG,jG,lG)*B4(lG,mG,kG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(k,i,j,l)*B4(l,m,n,k);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(kG,iG,jG,lG)*B4(lG,mG,nG,kG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(k,i,j,l)*B4(m,k,l,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(kG,iG,jG,lG)*B4(mG,kG,lG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(k,i,j,l)*B4(m,k,n,l);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(kG,iG,jG,lG)*B4(mG,kG,nG,lG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(k,i,j,l)*B4(m,l,k,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(kG,iG,jG,lG)*B4(mG,lG,kG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(k,i,j,l)*B4(m,l,n,k);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(kG,iG,jG,lG)*B4(mG,lG,nG,kG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(k,i,j,l)*B4(m,n,k,l);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(kG,iG,jG,lG)*B4(mG,nG,kG,lG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(k,i,j,l)*B4(m,n,l,k);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(kG,iG,jG,lG)*B4(mG,nG,lG,kG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(k,i,l,j)*B4(k,l,m,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(kG,iG,lG,jG)*B4(kG,lG,mG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(k,i,l,j)*B4(k,m,l,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(kG,iG,lG,jG)*B4(kG,mG,lG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(k,i,l,j)*B4(k,m,n,l);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(kG,iG,lG,jG)*B4(kG,mG,nG,lG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(k,i,l,j)*B4(l,k,m,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(kG,iG,lG,jG)*B4(lG,kG,mG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(k,i,l,j)*B4(l,m,k,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(kG,iG,lG,jG)*B4(lG,mG,kG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(k,i,l,j)*B4(l,m,n,k);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(kG,iG,lG,jG)*B4(lG,mG,nG,kG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(k,i,l,j)*B4(m,k,l,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(kG,iG,lG,jG)*B4(mG,kG,lG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(k,i,l,j)*B4(m,k,n,l);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(kG,iG,lG,jG)*B4(mG,kG,nG,lG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(k,i,l,j)*B4(m,l,k,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(kG,iG,lG,jG)*B4(mG,lG,kG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(k,i,l,j)*B4(m,l,n,k);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(kG,iG,lG,jG)*B4(mG,lG,nG,kG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(k,i,l,j)*B4(m,n,k,l);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(kG,iG,lG,jG)*B4(mG,nG,kG,lG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(k,i,l,j)*B4(m,n,l,k);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(kG,iG,lG,jG)*B4(mG,nG,lG,kG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(k,l,i,j)*B4(k,l,m,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(kG,lG,iG,jG)*B4(kG,lG,mG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(k,l,i,j)*B4(k,m,l,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(kG,lG,iG,jG)*B4(kG,mG,lG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(k,l,i,j)*B4(k,m,n,l);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(kG,lG,iG,jG)*B4(kG,mG,nG,lG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(k,l,i,j)*B4(l,k,m,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(kG,lG,iG,jG)*B4(lG,kG,mG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(k,l,i,j)*B4(l,m,k,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(kG,lG,iG,jG)*B4(lG,mG,kG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(k,l,i,j)*B4(l,m,n,k);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(kG,lG,iG,jG)*B4(lG,mG,nG,kG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(k,l,i,j)*B4(m,k,l,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(kG,lG,iG,jG)*B4(mG,kG,lG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(k,l,i,j)*B4(m,k,n,l);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(kG,lG,iG,jG)*B4(mG,kG,nG,lG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(k,l,i,j)*B4(m,l,k,n);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(kG,lG,iG,jG)*B4(mG,lG,kG,nG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(k,l,i,j)*B4(m,l,n,k);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(kG,lG,iG,jG)*B4(mG,lG,nG,kG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(k,l,i,j)*B4(m,n,k,l);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(kG,lG,iG,jG)*B4(mG,nG,kG,lG);
assert(C4==C4Test);


C4=0;


for (int i=0;i<3;i++) {
     for (int j=0;j<3;j++){
         for (int l=0;l<3;l++){
            for (int m=0;m<3;m++){
                for (int n=0;n<3;n++){
                    for(int k=0;k<3;k++){
                 C4(i,j,m,n)+=A4(k,l,i,j)*B4(m,n,l,k);
           }
        }
     }
     }
        }
}

C4Test(iG,jG,mG,nG)=A4(kG,lG,iG,jG)*B4(mG,nG,lG,kG);
assert(C4==C4Test);


C4=0;


}
Example #16
0
int		main(void)
{
	Bureaucrat	bob("bob", 45);
	Bureaucrat	jim("jim", 150);
	Bureaucrat	zac("zac", 2);
	Form		A4("A4", 45, 45);
	Form		A5("A5", 150, 21);
	ShrubberyCreationForm Creation("home");
	PresidentialPardonForm Pardon("Amedy Coulibaly");
	RobotomyRequestForm Robot("Zaz");

	try
	{
		Form a("fifi", 0, 2);
	}
	catch (std::exception const& e)
	{
		std::cout << "Form a: " << e.what() << std::endl;
	}
	try
	{
		Form b("fifi", 42, 151);
	}
	catch (std::exception const& e)
	{
		std::cout << "Form b: " << e.what() << std::endl;
	}
	std::cout << A4 << std::endl << A5 << std::endl << std::endl;
	std::cout << bob << std::endl << jim << std::endl << std::endl;
	try
	{
		A4.beSigned(jim);
	}
	catch (std::exception const& e)
	{
		std::cout << "Form A4: " << e.what() << std::endl;
	}
	std::cout << A4 << std::endl << std::endl;
	try
	{
		A4.beSigned(bob);
	}
	catch (std::exception const& e)
	{
		std::cout << "Form A4: " << e.what() << std::endl;
	}
	std::cout << A4 << std::endl << std::endl;
	bob.signForm(A4);
	bob.signForm(A5);
	jim.signForm(A4);
	jim.executeForm(Creation);
	bob.executeForm(Creation);
	zac.signForm(Pardon);
	zac.executeForm(Pardon);
	jim.executeForm(Pardon);
	zac.signForm(Robot);
	zac.executeForm(Robot);
	zac.executeForm(Robot);
	zac.executeForm(Robot);
	zac.executeForm(Robot);
	jim.executeForm(Robot);
}