Files
mfem/general/sets.cpp
T
2020-03-09 15:36:41 -07:00

138 lines
2.3 KiB
C++

// Copyright (c) 2010-2020, Lawrence Livermore National Security, LLC. Produced
// at the Lawrence Livermore National Laboratory. All Rights reserved. See files
// LICENSE and NOTICE for details. LLNL-CODE-806117.
//
// This file is part of the MFEM library. For more information and source code
// availability visit https://mfem.org.
//
// MFEM is free software; you can redistribute it and/or modify it under the
// terms of the BSD-3 license. We welcome feedback and contributions, see file
// CONTRIBUTING.md for details.
#include "sets.hpp"
namespace mfem
{
IntegerSet::IntegerSet(IntegerSet &s)
: me(s.me.Size())
{
for (int i = 0; i < me.Size(); i++)
{
me[i] = s.me[i];
}
}
int IntegerSet::operator== (IntegerSet &s)
{
if (me.Size() != s.me.Size())
{
return 0;
}
for (int i = 0; i < me.Size(); i++)
if (me[i] != s.me[i])
{
return 0;
}
return 1;
}
int IntegerSet::PickRandomElement()
{
int i, size = me.Size();
unsigned int seed = 0;
for (i = 0; i < size; i++)
{
seed += me[i];
}
srand(seed);
return me[rand()/(RAND_MAX/size)];
}
void IntegerSet::Recreate(const int n, const int *p)
{
int i, j;
me.SetSize(n);
for (i = 0; i < n; i++)
{
me[i] = p[i];
}
me.Sort();
for (j = 0, i = 1; i < n; i++)
if (me[i] != me[j])
{
me[++j] = me[i];
}
me.SetSize(j+1);
}
int ListOfIntegerSets::Insert(IntegerSet &s)
{
for (int i = 0; i < TheList.Size(); i++)
if (*TheList[i] == s)
{
return i;
}
TheList.Append(new IntegerSet(s));
return TheList.Size()-1;
}
int ListOfIntegerSets::Lookup(IntegerSet &s)
{
for (int i = 0; i < TheList.Size(); i++)
if (*TheList[i] == s)
{
return i;
}
mfem_error("ListOfIntegerSets::Lookup (), integer set not found.");
return -1;
}
void ListOfIntegerSets::AsTable(Table & t)
{
int i;
t.MakeI(Size());
for (i = 0; i < Size(); i++)
{
t.AddColumnsInRow(i, TheList[i] -> Size());
}
t.MakeJ();
for (i = 0; i < Size(); i++)
{
Array<int> &row = *TheList[i];
t.AddConnections(i, row.GetData(), row.Size());
}
t.ShiftUpI();
}
ListOfIntegerSets::~ListOfIntegerSets()
{
for (int i = 0; i < TheList.Size(); i++)
{
delete TheList[i];
}
}
}