Testando e visualizando grandes matrizes de índice

8

Em breve implementarei o método descontínuo de Galerkin nodal, e depois disso, antes de conhecer as matrizes básicas de indexação que precisarei computar, dados dados de malha e polinomiais.

O problema que encontrei no código anterior foram erros sutis que cometi ao computar coisas como indexação de rastreio interior / exterior. Os problemas que não surgissem em casos de teste mais simples surgiriam em malhas maiores, e geralmente isso gera um esquema instável, pois as condições de contorno não são impostas adequadamente (portanto, não há chance de apenas assistir a simulação a cada 10 etapas ou mais e ver um problema localizado) .

Espero que algumas pessoas mais experientes aqui conheçam bons testes para executar nas matrizes de índice para ter certeza de que estão certas. Quadraturas, derivadas e similares são muito fáceis de testar, mas outras coisas não consigo entender.

Alguns testes que fiz no passado estão adicionando normais interiores a normais externos, o que deve render 0 ou + -2. Ser capaz de ver rapidamente o resultado de alguma alteração de código é útil, mas não consigo pensar em uma maneira significativa de fazer isso com a indexação.

Devo também mencionar que isso é válido para quadríceps e hexágonos, com potencial para elementos curvilíneos. Não existe muito código existente para comparar com uma biblioteca de trabalho.

Pontos de bônus se houver bons testes de unidade que eu possa escrever que não contariam com uma resposta correta existente para comparar. Vou me contentar com muitas boas heurísticas.

Reid.Atcheson
fonte

Respostas:

7

A resposta óbvia seria, obviamente, não implementar tudo sozinho, mas usar o que os outros fizeram antes. Por exemplo, deal.II (http://www.dealii.org - isenção de responsabilidade: sou um dos autores desta biblioteca) já possui elementos DG em quadriláteros, hexágonos e elementos curvos, programas tutoriais que mostram como usar tudo isso já foi testado por uma década e é testado através de 2.700 testes de regressão após cada alteração no repositório. Há muito trabalho a ser salvo para você.

Kf(x)xiuh(x)=iUiφi(x)Ui=f(xi)uhf2=K|uh(x)f(x)|2dxfuh

uh

Obviamente, depois de executá-lo, você precisará salvar o testcase e executá-lo periodicamente para garantir que não esteja quebrando acidentalmente esse tipo de funcionalidade novamente.

Wolfgang Bangerth
fonte
Caso contrário, pelo menos um deles está correto. -> um deles está incorreto?
Ondřej Čertík
Sim, claro. Eu corrigi isso.
Wolfgang Bangerth
Obrigado pela boa resposta. O motivo pelo qual estou fazendo a maior parte disso é que a implementação faz parte da novidade da pesquisa, estou menos interessado na simulação em si do que em como posso melhorá-la com diferentes estratégias de implementação.
usar o seguinte código
Esse é um objetivo válido. Mas você está competindo com software que foi otimizado por uma década. Por que não tentar ver o que você pode melhorar em um dos pacotes existentes?
Wolfgang Bangerth