def testPredict(self,
        nchs,nrows,ncols,datatype):
        rtol,atol=1e-5,1e-8
        device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")        

        # Parameters
        nSamples = 8
        nChsTotal = sum(nchs)

        # nSamples x nRows x nCols x (nChsTotal-1)
        Xac = torch.randn(nSamples,nrows,ncols,nChsTotal-1,dtype=datatype,device=device,requires_grad=True)
        # nSamples x nRows x nCols 
        Xdc = torch.randn(nSamples,nrows,ncols,dtype=datatype,device=device,requires_grad=True)

        # Expected values
        # nSamples x nRows x nCols x nChsTotal
        expctdZ = torch.cat((Xdc.unsqueeze(dim=3),Xac),dim=3)

        # Instantiation of target class
        layer = NsoltChannelConcatenation2dLayer(
                name='Cn'
            )

        # Actual values
        with torch.no_grad():
            actualZ = layer.forward(Xac=Xac,Xdc=Xdc)

        # Evaluation
        self.assertEqual(actualZ.dtype,datatype)
        self.assertTrue(torch.allclose(actualZ,expctdZ,rtol=rtol,atol=atol))
        self.assertFalse(actualZ.requires_grad)